如何实现自定义搜索结果排名?

时间:2009-07-19 12:24:31

标签: java search lucene ranking

我的lucene索引包含带有“itemName”字段的文档。该字段通过0到1之间的提升因子进行提升。 当我创建一个BooleanQuery时,我希望结果按匹配子句的数量和boostfactor排序,所以公式如下:

score = (count_of_matching_clauses / count_of_total_clauses + boost_factor) / 2

如果所有子句匹配且提升因子为1,则得分始终为0到1之间的浮点数。

例如,如果没有提升因子的三个文档的“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);

将检索document1,得分为(2/2 +0)/ 2 = 0.5,因为: count_of_matching_clauses = 2和 count_of_total_clauses = 2

将检索document2,得分为(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_matching_clauses = 2和 count_of_total_clauses = 2

如何在lucene中实现这种排名机制?我如何告诉lucene使用我的自定义排名类对结果进行排名?

1 个答案:

答案 0 :(得分:1)

您可以通过扩展Similarity类并在搜索期间传递它来实现您自己的评分算法。在此类的Javadoc中(按照链接),您可以阅读评分算法的详细信息。可以找到更多关于评分的文字here。理解得分的特殊帮助是实际查看由Searcher.explain()

返回的得分解释 顺便说一句,您希望实施的得分是默认得分。结果的顺序将是所希望的,但实际分数可以不同于0.5或0.25。

编辑: 将原始答案中的链接更新为Lucene v2.4,更新为v5.3.1。