布尔查询的disable_coord参数是什么意思?

Kar*_*rma 11 elasticsearch

根据文档,ES中disable_coord的默认值为false.我找不到有关如何将此参数设置为true会影响搜索结果的详细说明.

小智 8

这是协调因素.

  • 如果启用了coord因子(默认情况下为"disable_coord":false)则表示:如果我们在文本中有更多搜索关键字,那么此结果将更具相关性并将获得更高分数.

  • 如果禁用coord因子("disable_coord":true)则表示:无论我们在搜索文本中有多少关键字,它都只会被计算一次.

您可以在此处找到更多详情.


imp*_*ren 6

如果Nbool查询中的子查询具有相同的提升/权重,那么disable_coord=true将遵循下一个逻辑...

假使,假设:

  • 所有子查询都具有相同的提升和重量.
  • N - 子查询总数.
  • n - 匹配的子查询数.

n子查询匹配时:总得分将与匹配查询的提升/权重之和成比例.正如我们现在假设相等的权重/提升,这将是:Sn = n*const.

当所有子查询匹配(n=N)时:Smax = N*const

与完全匹配相比,部分匹配将是 part_of_max = Sn / Smax = (n*const) / (N*const) = n/N

例如,如果您有3个子查询:

  • 所有子查询都匹配:总分将是 Smax
  • 2个子查询匹配:总分将是part_2 = 2/3=0.66(66%)Smax.
  • 1个子查询匹配:总分将是part_1 = 1/3=0.33(33%) Smax

让我们在启用协调时将其与得分进行比较(elasticsearch的默认行为).长话短说:"部分"比赛将比完整比赛得分更差.

近似分数将与匹配子查询的权重/增强之和相乘n/N.如果提升/权重相等,那么总得分将与之成比例Sn? = n*n/N * const = n²/N * const

当所有子查询匹配(n=N)时:Smax? = N*(N/N)*const = N * const

与完全匹配相比,部分匹配将是 part_of_max? = Sn? / Smax? = (n²/N * const) / (N * const) = n²/N²

例如,如果您有3个子查询:

  • 所有子查询都匹配:总分Smax与启用协调时的总分相同
  • 2个子查询匹配:总分将是part_2? = 4/9=0.44(44%)Smax?.或者比2/3更小(66%)part_2
  • 1个子查询匹配:总分将是part_1? = 1/9=0.11(11%) Smax?.或者比1/3小(33%)part_1

不同的协调方法相互比较:disable_coord=Falsedisable_coord=True(n²/N²)/(n/N) = n/N时间小于分数时的分数

具有不同协调策略的不同查询类型的可能用例:

  • "fuller"匹配应该比部分匹配更相关:使用默认的bool查询并启用协调
  • 每个子查询都是自给自足的,并且更多子查询的匹配是好的并且"线性"很重要:使用box查询和disable_coord = True
  • 当每个子查询同等重要且1个子查询的匹配应该被视为与所有子查询的匹配相同:使用dis_max查询
  • 当您在多个字段中搜索并且多个字段中的非重叠匹配比单个字段中的相同数量的匹配更好:使用bool和dis_max查询的组合(文档中的更多详细信息:https://www.elastic.co/ guide/en/elasticsearch/reference/current/query-dsl-dis-max-query.html)

请注意,当术语在文档中多次出现时,相同的子查询可能会有不同的分数:这由term_frequency控制(https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html#tf) - 并且它不会受到disable_coord另一个答案(/sf/answers/1889913231/)中所述内容的影响.字段长度标准化也会影响结果的计算方式

如果您想知道这三个概念如何协同工作,请参阅以下示例:

查询:quick brown fox- 这实际上是3个查询与"OR"相结合

disable_coord = TRUE:

  • quick brown fox rocks - 得分 ~=3*1/(sqrt(4))*const = 3*tmp_const
  • quick brown fox quick - 得分 ~=(1+1*sqrt(2)+1)*1/(sqrt(4))*const = 3.41 * tmp_const
  • quick brown fox quick fox- 得分~=(1+1*sqrt(2)+1*sqrt(2))*1/(sqrt(5))*const = 3.82 * 0.89 tmp_const = 3.42 * tmp_const.一个额外的狐狸使结果更相关,但这可以通过场长标准化来补偿
  • quick brown bird flies - 得分 ~=2*1/(sqrt(4))*const = 2*tmp_const
  • quick brown bird - 得分 ~=2*1/(sqrt(3))*const = 2*1.1547*tmp_const ~= 2.31*tmp_const
  • fox- 分数~=2*1/(sqrt(1))*const = 2*2*tmp_const ~= 4*tmp_const- 得分甚至更大quick brown fox quick.这是由场长标准化引起的

disable_coord =假:

  • 快速棕色狐狸岩石(coord_factor = 3/3 = 1) - 得分 ~=3*1/(sqrt(4))*const = 3*tmp_const
  • 快速棕色狐狸快(coord_factor = 3/3 = 1) - 得分 ~=(1+1*sqrt(2)+1)*1/(sqrt(4))*const = 3.41 * tmp_const
  • 快速棕色狐狸快速狐狸(coord_factor = 3/3 = 1) - 得分 ~=(1+1*sqrt(2)+1*sqrt(2))*1/(sqrt(5))*const = 3.82 * 0.89 tmp_const = 3.42 * tmp_const
  • 快速的棕色鸟苍蝇(coord_factor = 2/3 = 0.66) - 得分~=2*1/(sqrt(4))*const * 2/3 = 1.33*tmp_const.由于协调,分数较低
  • 快速棕色鸟(coord_factor = 2/3 = 0.66) - 得分~=2*1/(sqrt(3))*const *2/3 = 2*1.1547*tmp_const * 2/3 ~= 1.54*tmp_const..由于协调,分数较低
  • fox(coord_factor = 1/3 = 0.33) - 得分~=2*1/(sqrt(1))*const * 1/3 = 2*2*tmp_const * 1/3 ~= 1.33*tmp_const.由于"协调",这个结果现在与所有3个术语的结果相关性较低

真实分数还取决于IDF(反向文档频率).上面的示例假设所有术语在索引中具有相同的频率.


小智 3

它用于 lucene 评分。在打分结果的同时,

示例 如果我想修改任何 bool 查询的坐标分数,以便在某些特定子句或文本或值匹配时整个查询将乘以 2。