私の lucene インデックスには、フィールド「itemName」を持つドキュメントが含まれています。このフィールドは、0 から 1 の間のブースト ファクターでブーストされます。BooleanQuery を作成するときに、一致した句の数とブースト ファクターによって結果をランク付けしたいので、式は次のようになります。
score = (count_of_matching_clauses / count_of_total_clauses + boost_factor) / 2
スコアは常に 0 から 1 の間の浮動小数点数になります。すべての句が一致し、ブースト ファクターが 1 の場合は 1 です。
たとえば、ブースト係数のない 3 つのドキュメントの "itemName" のフィールド値が次の場合:
document1: "java is an island"
document2: "the secret of monkey island"
document3: "java island adventures"
BooleanQuery は次のようになります。
TermQuery query1 = new TermQuery(new Term("name","java"));
TermQuery query2 = new TermQuery(new Term("name","island"));
BooleanQuery query = new BooleanQuery();
query.add(query1, BooleanClause.Occur.SHOULD);
query.add(query2, BooleanClause.Occur.SHOULD);
count_of_matching_clauses = 2 および count_of_total_clauses = 2 であるため、document1 は (2/2 +0)/2 = 0.5 のスコアで取得されます。
document2 は (1/2+0)/2 = 0.25 のスコアで取得されます: count_of_matching_clauses = 1 および count_of_total_clauses = 2
count_of_matching_clauses = 2 および count_of_total_clauses = 2 であるため、document3 は (2/2 +0)/2 = 0.5 のスコアで取得されます。
このランキングメカニズムを lucene に実装するにはどうすればよいですか? 結果のランク付けにカスタム ランキング クラスを使用するように lucene に指示するにはどうすればよいですか?