摘要:对于 Lucene > 6.x,将 disableCoord 设置为 true,否则将其设置为 false。
Coord 是 BooleanQuery 的一个评分功能,用于抵消 TF/IDF 对过饱和术语的一些缺点。它仅与多个 should 子句有关。在您的第一个场景中,所有子查询必须匹配,不涉及坐标因子并且disableCoord
参数无效。在第二种情况下,当有多个 should 子句时,aBooleanQuery
将所有子分数相加来确定哪个文档更匹配。这个想法是匹配更多子查询的文档是更好的匹配,因此获得更好的分数。
现在,想象一个查询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
out 的文档将其分数减半,抵消过饱和给出x OR y
的高分。x
如果您禁用了坐标,则不会计算此因素,最终分数仅为子分数的总和。
Coord 的设计考虑了 TF/IDF,其他相似性公式可能不会受到过度饱和项的影响。BM25 已成为 Lucene 6.0 中的默认相似度,它对此类过饱和项有更好的控制,由其k1 参数控制。BM25 的分数不是随着 termFreq 的增加而接近线性增长,而是接近极限并停止增长。对于具有 termFreq=1000 的文档比具有 termFreq=5 的文档没有任何提升,但对于 termFreq=1 而不是 termFreq=0 的文档则这样做。Britta Weber 曾在流行语上就此发表演讲,她解释了饱和曲线。
这意味着,对于 BM25,坐标因子不再是必需的,实际上可能会导致违反直觉的结果。它已从 Lucene master 中删除,并将在 7.0 中消失。
如果您使用 Lucene 6.x 和默认相似度 BM25,最好始终禁用坐标,因为 BM25 不会遇到坐标问题。如果您使用的是 TF/IDF(无论是否为 6.x),只要您的词频分布均匀(实际上从未如此)并设置disableCoord
为 false(默认值),禁用 coord 只会为您提供更可预测的结果) 将给出直观上更好的结果。