使用booleanquery进行lucene排名 - 确定命中质量

时间:2014-10-21 23:20:52

标签: lucene scoring booleanquery

我正在使用由termqueries构成的booleanquery,所有这些都在同一个字段上,所有这些都设置在' SHOULD'此刻。

我试图弄清楚ScoreDoc []结果对象的排名如何适用于此查询,但是找不到合适的文档,也许您可​​以帮助解决以下问题:

1)booleanquery等级是否会匹配所有高于仅匹配单个术语的命中的术语?

2)有没有办法确定哪个termquery匹配,哪个不是scoredoc对象?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

布尔查询确实对多个查询项的命中次数比仅匹配一次的查询项更高,但请记住,这只是评分算法的一部分。还有许多其他影响可以解决这个问题。

由布尔查询组合的查询字词将它们的子分数相乘以形成最终分数,因此更多的查询字词匹配自然会更加重要。最重要的是,有一个坐标因子,当较大比例的查询词匹配时,它会更大,这也会加到得分中。

但是,相同查询字词,文档长度,术语稀有度和提升次数的多个匹配项也会对分数产生影响,并且即使它们与所有字词不匹配,也很可能拥有文档,从这些影响中获得更高的分数。

有关此处使用的算法的详细信息,请参阅TFIDFSimilarity docs

要了解查询文档的评分,您应该熟悉Explanation。您可以按原样获得文档评分原因的可读解释:

Explanation explain = searcher.explain(myQuery, resultDocNo);
System.out.print(explain.ToString());

要识别与查询匹配的文档片段,您可以使用Highlighter,其简单用法可能是:

QueryScorer scorer = new QueryScorer(myQuery);
Highlighter highlighter = new Highlighter(scorer);
String fragment = highlighter.getBestFragment(analyzer, fieldName, myDoc.getField(fieldName));