2009-07-19 133 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