を拡張して独自の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"/>