我不知道setDisableCoord是什么,也不知道应该为它设置什么值。我理解简单查询中的coord (例如TF下手查询)。但不明白它在包含多个查询的布尔查询中意味着什么。
若要提供某些上下文,请假定以下两种场景。我应该在setDisableCoord中为其中的每一个设置什么值?
发布于 2016-09-11 12:51:32
摘要:对于Lucene > 6.x,将disableCoord设置为true,否则将其设为false。
Coord是BooleanQuery的一个评分特性,以弥补TF/IDFs对于过度饱和项的一些缺点。它只适用于多个only子句。在第一个场景中,所有子查询都必须匹配,不涉及coord因素,并且disableCoord参数没有任何影响。在第二个场景中,当有多个应该子句时,一个BooleanQuery将所有的子分数进行汇总,以确定哪一个文档更匹配。这样的想法是,匹配更多子查询的文档是更好的匹配,从而获得更好的分数。
现在,假设有一个查询x OR y和一个文档,其中有1000个x,但没有一个y。对于TF/IDF,由于termFreq(x)较高,x的子分数很高,x OR y的结果分数也很高,它可以在其他文档之前推送文档,这匹配了两个字段,这不是BooleanQuery所要做的。这就是合作伙伴发挥作用的地方。
coord因子是以number of should clauses matched/total number of should clauses in query的形式计算的。这基本上给出了[0..1]中的一个数字,表示有多少子查询与文档匹配。然后,所有子查询的加分乘以这个coord因子。一个匹配all gave子句的文档将有所有求和子查询的原始分数,而只有x在x OR y中匹配的文档将使它的分数减半,从而抵消过度饱和的x给出的高分。如果禁用coord,则不会计算此因子,而最终得分仅为子分数之和。
Coord的设计考虑了TF/国防军,其他相似公式可能不会受到过饱和术语的影响。BM25已经成为Lucene6.0中默认的相似之处,它可以更好地控制这些由k1参数控制的过度饱和的术语。而不是随着termFreq的增加而接近线性增长的分数,BM25接近极限并停止增长。对于具有termFreq=1000的文档来说,它不会比有termFreq=5的文档提供任何支持,但是对于termFreq=1而不是termFreq=0的文档则是这样做的。布里塔·韦伯给出了一个关于这个问题的用时髦的话说话,她解释了饱和曲线。
这意味着,对于BM25来说,coord因素不再是必要的,实际上可能会导致违反直觉的结果。它已经从Lucene主人移除,并将在7.0中消失。
如果您使用的是Lucene6.x,而不是默认的相似性BM25,那么最好始终禁用coord,因为BM25不受coord工作问题的困扰。如果您使用TF/国防军(不管6.x与否),禁用coord只会给您提供更可预测的结果,前提是您的术语频率分布均匀(实际上从来没有),并且将disableCoord设置为false (默认)会给出直观上更好的结果。
https://stackoverflow.com/questions/39428216
复制相似问题