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

时间:2014-09-04 23:57:27

标签: elasticsearch

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

4 个答案:

答案 0 :(得分:8)

这是协调因素。

  • 如果启用了coord因子(默认情况下" disable_coord":false)那么它 意味着:如果我们在文本中有更多搜索关键字,那么这个结果会更相关,并且会得到更高的分数

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

您可以找到更多详细信息here

答案 1 :(得分:6)

如果bool查询中有N子查询具有相同的提升/权重,那么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的总分为Smax(66%)。
  • 1个子查询匹配:总分为part_1 = 1/3=0.33
  • Smax(33%)

让我们在启用协调时将其与得分进行比较(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的{​​{1}}(44%)。或者比Smax₂
  • 小2/3(66%)
  • 1个子查询匹配:总分为part_2的{​​{1}}(11%)。或者比part_1₂ = 1/9=0.11
  • 小1/3(33%)

不同的协调方法相互比较:Smax₂小于part_1 disable_coord=False

时的分数

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

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

请注意,当术语在文档中多次出现时,相同的子查询可能会有不同的分数:这是由term_frequency(https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html#tf)控制的 - 并且它不受disable_coord=True对另一个子句的影响回答(https://stackoverflow.com/a/26998760/952437)。场长标准化也会影响结果的计算方法

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

查询:(n²/N²)/(n/N) = n/N - 这实际上是3个与“OR”结合的查询

disable_coord =真:

  • disable_coord - 得分quick brown fox
  • 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相比更大。这是由字段长度标准化
  • 引起的

disable_coord =假:

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

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

答案 2 :(得分:3)

它用于lucene得分。在对结果进行评分时,

实施例 如果我想修改任何bool查询的coord分数,那么整个 如果匹配某个特定子句或文本或值,则查询将乘以2。

答案 3 :(得分:2)

假设您有一个should子句,其中您有三个查询,现在假设一个文档与第一个bool查询匹配,那么它将获得一些分数,但假设此查询与第二个查询不完全匹配但部分匹配,现在此文档将是给予一些额外的小额分数意味着(第一个查询匹配分数+第二个查询部分匹配分数)。

现在如果你不希望在你的查询中给出这个部分分数,那么你应该写“disable_coord”:true它会做什么只会根据完全匹配的查询给予文档分数而不是部分匹配。我希望你现在得到它......... :)。