14.6.5. Lucene のスコアリングカスタマイズ
Lucene を使用するとユーザーは、
org.apache.lucene.search.Similarity
を拡張して、そのフラグ式をカスタマイズできます。このクラスで定義された抽象メソッドは、以下の式の係数と一致し、ドキュメント d のクエリー q のスコアを計算します。
score (q、d)= coord (q、d)queryNorm (q)∑ t in q (tf (t in d)idf (t) 2 t.getBoost ()norm (t、d))
ファクター | 説明 |
---|---|
tf(t ind) | ドキュメント (d) の用語 (t) の周波数係数。 |
idf(t) | 用語の頻度に関する記録。 |
coord(q,d) | 指定されたドキュメントのクエリー用語がいくつあるかに基づくスコア要因。 |
queryNorm(q) | クエリー間でスコアを設定するために使用される正規化の要素。 |
t.getBoost() | フィールドブースト。 |
norm(t,d) | いくつかの (インデックス時間) ブーストおよび長さ要素をカプセル化します。 |
この式の詳細は、本書の範囲外です。詳細については、
Similarity
の Javadoc を参照してください。
Hibernate Search では、Lucene の類似性の計算を修正する方法を利用できます。
まず、プロパティーを使用して
類似性
実装の完全に指定されたクラス名を指定することにより、デフォルトの類似性を設定できますhibernate.search.similarity
。デフォルト値は org.apache.lucene.search.DefaultSimilarity
です。
また、
similarity
プロパティーを設定して特定のインデックスに使用される類似性を上書きすることもできます。
hibernate.search.default.similarity = my.custom.Similarity
最後に、
@Similarity
アノテーションを使用してクラスレベルのデフォルトの類似性を上書きできます。
@Entity
@Indexed
@Similarity(impl = DummySimilarity.class)
public class Book {
...
}
たとえば、ドキュメントに用語が表示される頻度は重要ではないと仮定します。用語が 1 回出現したドキュメントは、複数回見つかったドキュメントと同様にスコア付けされる必要があります。この場合、メソッドのカスタム実装
tf(float freq)
1.0 を返す必要があります。
警告
2 つのエンティティーが同じインデックスを共有する場合、同じ
Similarity
実装を宣言する必要があります。同じクラス階層のクラスは常にインデックスを共有するため、Similarity
実装の上書きはできません。
同様に、インデックス設定とクラスレベルの設定で類似性を定義することは、競合が発生するため意味がありません。このような設定は拒否されます。