0

インデックス作成が優れている場合にノルムを使用すると、私の問題は、非常に短いフィールドが不適切に高くランク付けされることです。例:

doc1 : tf(200) out of 1.000 
doc2 : tf(150) out of 500

doc2 の方がスコアが高く、優れています。

問題は私が持っているときです:

doc3 : tf(3) out of 4

これは非常にまれなドキュメントであるため、私の場合はあまり良くありません。例外としましょう。

KinoSearch や、この問題を相殺するために定数を導入することを提案している誰かを読みました。標準を使用してこの問題を回避する方法についてのアイデアはありますか?

ありがとう

4

1 に答える 1

2

を拡張して独自のSimilarityクラスを作成し、メソッドDefaultSimilarityをオーバーライドするだけです。lengthNormデフォルトの lengthNorm の実装は非常に単純です。

public float lengthNorm(FieldInvertState state) {
    final int numTerms;
    if (discountOverlaps)
        numTerms = state.getLength() - state.getNumOverlap();
    else
        numTerms = state.getLength();
    return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
}

あなたのケースで意味のあるアルゴリズムに置き換えてください。本当に、最後の行はおそらく変更について本当に心配する必要があるすべてです。特に1.0 / Math.sqrt(numTerms). ここで、次の 2 つの点に注意してください。

  • ノルムは、スペースを節約するために、非常に損失の多い方法 (10 進数で有効数字約 1 桁!) で圧縮されます。大きな違いは重要であり、小さな微調整は失われがちです。
  • インデックスを再作成する必要があります。ノルムは、クエリ時に計算されるのではなく、インデックス時に格納されます。

次のように、スキーマで類似性を使用するように Solr を設定できます。

<similarity class="this.is.my.CustomSimilarity"/>
于 2013-11-13T07:06:46.373 に答える