首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BooleanQuery setDisableCoord

BooleanQuery setDisableCoord
EN

Stack Overflow用户
提问于 2016-09-10 16:32:36
回答 1查看 813关注 0票数 0

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

若要提供某些上下文,请假定以下两种场景。我应该在setDisableCoord中为其中的每一个设置什么值?

  1. 在第一个场景中,我有一个BooleanClause.Occur.FILTER查询(该查询仅用于过滤),另一个查询用于得分(BooleanClause.Occur.MUST)。在这个场景中,第一个查询只检查文档的“年份”字段是否在指定的范围内,第二个查询使用一些算法进行排序。
  2. 在第二个场景中,我对BooleanClause.Occur.SHOULD有两个查询,这些查询的分数必须结合起来才能获得文档的最终检索分数。
EN

回答 1

Stack Overflow用户

发布于 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子句的文档将有所有求和子查询的原始分数,而只有xx 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 (默认)会给出直观上更好的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39428216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档