2009-07-19 18 views
3

私のluceneインデックスには、 "itemName"フィールドのドキュメントが含まれています。カスタム検索結果ランク付けを実装する方法は?

score = (count_of_matching_clauses/count_of_total_clauses + boost_factor)/2 
:私は結果が一致した句の数とboostfactorによってランク付けされていることをたいと思いますので、式は次のようになりBooleanQueryを作成すると、このフィールドは0と1の間の ブースト要因でブーストされます

すべての句が一致し、ブースト係数が1の場合、スコアは常に0と1. 1の間の浮動小数点になります。

たとえば、ブースト係数のない3つのドキュメントのフィールド値が、

document1: "java is an island" 
document2: "the secret of monkey island" 
document3: "java island adventures" 

とブーleanQueryは次のようになり:

文書1より
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); 

は(2/2 +0)のスコアで取得される/ 2 = 0.5ので:count_of_matching_clauses = 2及び count_of_total_clauses = 2

文書2は次のようになり (1/2 + 0)/ 2のスコアと取得= 0.25理由: count_of_matching_clauses = 1と count_of_total_clauses = 2 document3が(2/2 +0)/ 2のスコアを用いて取得されるよりも

=理由:0.count_of_match ing_clauses = 2と count_of_total_clauses = 2

luceneでこのランキング技術を実装するにはどうすればよいですか?結果をランク付けするためにカスタムランキングクラスを使用するようにluceneに指示するにはどうすればよいですか?

答えて

1

Similarityクラスを拡張して検索中に渡すことで、独自のスコアリングアルゴリズムを実装できます。このクラスのJavadoc(リンクに続く)では、得点アルゴリズムの詳細を読むことができます。スコアリングに関するテキストは、hereで見つけることができます。スコアリングを理解するための特別な援助は、返される得点の説明を実際に見ることです。実装するスコアリングはデフォルトのスコアリングです。Searcher.explain()

実際の得点は0.5または0.25とは異なる場合がありますが、結果の順序は希望どおりになります。

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

+0

いいえ、これはデフォルトのスコアリングではありません。これはcoord()ファクタに関連していますが、tf()とidf()はスコアだけでなく順序も変更する可能性があります。残りの答えはうまくいきます - 特にexplain()部分。 –

+0

あなたの答えは正しいです。両方のクエリが一致している他のドキュメントより高いtf-idfスコアのため、1つのクエリだけでドキュメントの得点が高くなる可能性があります。しかし、偶然にも、クエリが一致するほど、DefaultSimilarityのスコアが高いことがわかりました。 –

+0

類似度クラスを変更すると、得点や標準ランキング式の要素だけが変更されますか? – tommyL

関連する問題