我不知道setDisableCoord是什么,我应该为它设置什么值。我在一个简单的查询(例如TFIDF查询)中理解coord。但是不要理解在包含多个查询的布尔查询中它意味着什么。
为了给出一些上下文,假设以下两个场景。我应该在setDisableCoord中为每个值设置什么值?
答案 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},禁用坐标将只会为您提供更可预测的结果错误(默认值)将给出结果,直观上更好。