3

私の 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 に指示するにはどうすればよいですか?

4

1 に答える 1

1

Similarityクラスを拡張して検索中に渡すことで、独自のスコアリング アルゴリズムを実装できます。このクラスの Javadoc (リンクをたどる) で、スコアリング アルゴリズムの詳細を読むことができます。スコアリングに関するその他のテキストについては、こちらを参照してください。スコアリングを理解するための特別な助けは、 Searcher.explain()によって返されるスコアリングの説明を実際に見ることです。

ところで、実装したいスコアリングはデフォルトのスコアリングです。結果の順序は希望どおりですが、実際のスコアは 0.5 または 0.25 とは異なる場合があります。

編集: Lucene v2.4 を参照していた元の回答のリンクを v5.3.1 に更新しました。

于 2009-07-20T07:14:40.307 に答える