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

Java 如何实现自定义搜索结果排名?,java,search,lucene,ranking,Java,Search,Lucene,Ranking,我的lucene索引包含字段为“itemName”的文档。该字段使用介于0和1之间的增强因子进行增强。 创建布尔查询时,我希望结果按照匹配子句的计数和boostfactor进行排序,因此公式如下所示: score = (count_of_matching_clauses / count_of_total_clauses + boost_factor) / 2 分数总是在0到1之间浮动。如果所有子句都匹配,且提升系数为1,则为1 例如,如果三个没有提升因子的文档的“itemName”字段值为:

我的lucene索引包含字段为“itemName”的文档。该字段使用介于0和1之间的增强因子进行增强。 创建布尔查询时,我希望结果按照匹配子句的计数和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"
布尔查询看起来像:

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的分数检索文档1,因为: 匹配子句的计数=2和 总计子句的计数=2

将以(1/2+0)/2=0.25的分数检索文档2,因为: 匹配子句的计数=1和 总计子句的计数=2

将以(2/2+0)/2=0.5的分数检索文档3,因为: 匹配子句的计数=2和 总计子句的计数=2


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

您可以通过扩展类并在搜索过程中传递来实现自己的评分算法。在这个类的Javadoc中(按照链接),您可以阅读评分算法的详细信息。可以找到更多关于评分的文本。理解得分的一个特殊帮助是实际查看由返回的对得分的解释

顺便说一句,您希望实施的评分是默认评分。结果的顺序将根据需要,尽管实际分数可能不同于0.5或0.25

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

否,这不是默认评分。它与coord()因子有关,但tf()和idf()可能不仅会改变分数,还会改变顺序。答案的其余部分很好,特别是explain()部分。好吧,你的答案是正确的,因为tf idf分数很高,一个文档在只有一个查询时的分数可能比其他文档在两个查询都匹配时的分数高。但是,有趣的是,我发现查询匹配越多,DefaultSimilarity的分数就越高。更改相似度类是否也会更改分数,或者只是更改标准排名公式的组成部分?分数的基本组成部分保持不变。您可以选择要更改的内容。链接已断开。我试图更新它们,但似乎不再使用Searcher类。如果有最近Lucene经验的人能够更新这个答案,那就太好了。