BooleanQuery setDisableCoord

时间:2016-09-10 16:32:37

标签: lucene booleanquery

我不知道setDisableCoord是什么,我应该为它设置什么值。我在一个简单的查询(例如TFIDF查询)中理解coord。但是不要理解在包含多个查询的布尔查询中它意味着什么。

为了给出一些上下文,假设以下两个场景。我应该在setDisableCoord中为每个值设置什么值?

  1. 在第一个场景中,我有一个使用BooleanClause.Occur.FILTER的查询(该查询仅用于过滤),另一个用于评分(BooleanClause.Occur.MUST)。在这种情况下,第一个查询仅检查"年"文档的字段在指定的范围内,第二个查询使用一些算法进行排名。
  2. 在第二个场景中,我有两个使用BooleanClause.Occur.SHOULD的查询,其分数必须合并才能获得文档的最终检索分数。

1 个答案:

答案 0 :(得分:2)

总结:对于Lucene> 6.x,将disableCoord设置为true,否则将其保留为false。

Coord是BooleanQuery的一个评分功能,可以抵消TF / IDF过度饱和条款的一些缺点。它只适用于多个should子句。在您的第一个场景中,所有子查询必须匹配,不涉及协调因素,disableCoord参数无效。 在第二种情况下,当有多个should子句时,BooleanQuery总结所有子分数以确定哪个文档是更好的匹配。我们的想法是,匹配更多子查询的文档是更好的匹配,因此获得更好的分数。

现在,设想一个查询x OR y和一个包含1000次x但没有y的文档。使用TF / IDF时,由于termFreq(x)较高,x的子得分非常高,x OR y得分也是如此,这可以将此文档推到其他人之前,匹配两个字段,这不是BooleanQuery的意图。这就是协调发挥作用的地方。

每个文档计算的坐标因子为number of should clauses matched/total number of should clauses in query。这基本上给出[0..1]中的数字,表示有多少子查询与文档匹配。然后将所有子查询的总和得分乘以该坐标因子。匹配所有should子句的文档将具有所有求和子查询的原始分数,并且x中仅x OR y的文档将使其得分减半,从而抵消了该分数的高分。过度饱和的x给了。如果您禁用了coord,则不会计算此因子,最终得分只是子得分的总和。

Coord的设计考虑了TF / IDF,其他相似性公式可能不会受到过度饱和的条款的影响。 BM25已经成为Lucene 6.0中的默认相似性,它可以更好地控制这种过度饱和的术语,由k1 parameter控制。 BM25接近极限并停止增长,而不是随着termFreq增加而变得接近线性的分数。对于termFreq = 1000的文档,对于termFreq = 5的文档,它不会提升,但对于termFreq = 1,termFreq = 1的文档也是如此。 Britta Weber给出了talk at buzzwords这个,她解释了饱和曲线。

这意味着,对于BM25,不再需要协调因子,实际上可能导致反直觉的结果。它已经从Lucene master中删除,将在7.0中消失。

如果您使用Lucene 6.x并且默认相似度为BM25,那么始终禁用坐标是一个好主意,因为BM25不会遇到coord解决的问题。如果您正在使用TF / IDF(无论是否为6.x),只要您的术语频率均匀分布(实际上从未如此)并设置{{1},禁用坐标将只会为您提供更可预测的结果错误(默认值)将给出结果,直观上更好。