我正在使用由术语查询构成的布尔查询,所有这些都在同一个字段上,目前都设置为“应该”。
我试图弄清楚 ScoreDoc[] 结果对象的排名如何用于此查询,但无法找到正确的文档,也许您可以帮助解决以下问题:
1)布尔查询将匹配所有术语的命中排名高于仅匹配单个术语的命中吗?
2) 有没有办法确定哪个 termquery 匹配,哪个不匹配生成的 scoreoc 对象?
谢谢您的帮助!
我正在使用由术语查询构成的布尔查询,所有这些都在同一个字段上,目前都设置为“应该”。
我试图弄清楚 ScoreDoc[] 结果对象的排名如何用于此查询,但无法找到正确的文档,也许您可以帮助解决以下问题:
1)布尔查询将匹配所有术语的命中排名高于仅匹配单个术语的命中吗?
2) 有没有办法确定哪个 termquery 匹配,哪个不匹配生成的 scoreoc 对象?
谢谢您的帮助!
布尔查询确实比只匹配一个的查询对多个查询词的命中排名更高,但请记住,这只是评分算法的一部分。还有许多其他影响可以消除这种影响。
通过布尔查询组合的查询词将其子分数相乘以形成最终分数,因此更多的查询词匹配自然会受到更大的权重。最重要的是,有一个坐标因子,当更大比例的查询词匹配时,它会更大,它也会乘以分数。
但是,同一查询词、文档长度、词条稀有度和提升的多次匹配也会影响分数,即使文档不匹配所有词,也很可能会从这些影响中获得更高的分数。
有关此处使用的算法的详细信息,请参阅TFIDFSimilarity 文档。
要了解查询文档的评分,您应该熟悉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));