3

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

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"

和 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

比 document3 检索到的分数为 (2/2 +0)/2 = 0.5,因为:count_of_matching_clauses = 2 和 count_of_total_clauses = 2

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

4

1 回答 1

1

您可以通过扩展Similarity类并在搜索期间传递它来实现自己的评分算法。在该类的 Javadoc(点击链接)中,您可以阅读评分算法的详细信息。更多关于评分的文字可以在这里找到。理解评分的一个特殊帮助是实际查看Searcher.explain()返回的评分解释

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

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

于 2009-07-20T07:14:40.307 回答