2009-07-19 50 views
3

我的lucene索引包含字段爲「itemName」的文檔。此字段提升與0和1之間 增強因素,當我創建一個BooleanQuery我想,結果被匹配的條款和boostfactor的數量排名,所以計算公式如下:如何實現自定義搜索結果排名?

score = (count_of_matching_clauses/count_of_total_clauses + boost_factor)/2 

得分將始終爲0到1之間的浮點數。1在所有子句匹配並且提升因子爲1的情況下。

例如,如果沒有提升因子的三個文檔的「itemName」的字段值爲:

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

and the Boo leanQuery將如下所示: count_of_matching_clauses = 2和 count_of_total_clauses = 2

文件2將是:

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); 

比文檔1將與一個分數的(2/2 0)/ 2 = 0.5,因爲要檢索得分爲(1/2 + 0)/ 2檢索= 0.25,因爲: count_of_matching_clauses = 1和 count_of_total_clauses = 2

比文件3將與一個分數的(2/2 0)/ 2被檢索= 0.5因爲: count_of_match ing_clauses = 2和 count_of_total_clauses = 2

如何在lucene中實現這種排名機制?我如何告訴lucene使用我的自定義排名類來對結果進行排名?

回答

1

您可以通過擴展Similarity類並在搜索過程中傳遞它來實現您自己的評分算法。在這個類的Javadoc中(點擊鏈接),您可以閱讀評分算法的詳細信息。有些更多的文字可以在here找到。理解得分的一個特別的幫助是實際上看到由Searcher.explain()

返回的評分的解釋,您希望執行的得分是默認得分。結果順序將按需要,但實際分數可能不同於0.5或0.25。

編輯: 更新了原始答案中提到Lucene v2.4到v5.3.1的鏈接。

+0

不,這不是默認打分。它與coord()因子有關,但tf()和idf()不僅可以改變分數,還可以改變排序。剩下的答案很好 - 特別是explain()部分。 – 2009-07-20 08:28:53