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

vdzxcuhz  于 5个月前  发布在  ElasticSearch
关注(0)|答案(4)|浏览(78)

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

baubqpgj

baubqpgj1#

这是协调因素。

  • 如果coord factor被启用(默认为“disable_coord”:false),那么它意味着:* 如果我们在文本中有更多的搜索关键字,那么这个结果将更相关,并将获得更高的分数 *。
  • 如果coord factor被禁用(“disable_coord”:true),那么它意味着:* 无论我们在搜索文本中有多少关键字,它都只被计算一次。*

更多细节你可以在这里找到。

kpbpu008

kpbpu0082#

如果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个子查询匹配:总分为Smaxpart_2 = 2/3=0.66(66%)。
  • 1个子查询匹配:总分为Smaxpart_1 = 1/3=0.33(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个子查询匹配:总分将是Smax₂part_2₂ = 4/9=0.44(44%)。或者比part_2小2/3(66%)
  • 1个子查询匹配:总分将是Smax₂part_1₂ = 1/9=0.11(11%)。或者比part_1小1/3(33%)

不同协调方法之间的比较:disable_coord=False的得分小于disable_coord=True乘以(n²/N²)/(n/N) = n/N的得分
具有不同协调策略的不同查询类型的可能用例:

  • “fuller”匹配应该比部分匹配更相关:使用启用协调的默认bool查询
  • 每个子查询都是自给自足的,多个子查询的匹配很好,“线性”很重要:使用bold query with 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在文档中出现多次时,同一子查询可能会有不同的分数:这由term_frequency(https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html#tf)控制--并且不受disable_coord与另一个答案(https://stackoverflow.com/a/26998760/952437)中所述内容的影响。字段长度规范化也会影响结果的计算方式
如果你想知道这三个概念是如何一起工作的,请看下面的例子:
查询: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的分数。一个额外的fox使结果更相关,但这是通过字段长度标准化补偿的
  • 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=False:

  • 快褐狐岩(coord_factor=3/3=1)--~=3*1/(sqrt(4))*const = 3*tmp_const得分
  • quick brown fox quick(coord_factor=3/3=1)--得分~=(1+1*sqrt(2)+1)*1/(sqrt(4))*const = 3.41 * tmp_const
  • quick brown fox quick fox(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(倒排文档频率)。上面的例子假设所有的术语在索引中具有相同的频率。

sirbozc5

sirbozc53#

它用于Lucene评分。在对结果进行评分时,
示例如果我想修改任何bool查询的coord score,使得如果某些特定的子句或文本或值匹配,整个查询将乘以2。

atmip9wb

atmip9wb4#

假设你有一个should子句,其中有三个查询,现在假设一个文档匹配第一个bool查询,那么它会得到一些分数,但是假设这个查询不完全匹配第二个查询,而是部分匹配,现在这个文档会得到一些额外的分数,这意味着(第一个查询匹配分数+第二个查询部分匹配分数)。
现在,如果你不想在你的查询中给出这个部分分数,那么你应该写“disable_coord”:true它会做什么,它只会根据完全匹配的查询而不是部分匹配的文档给出分数。我希望你现在得到它...:)

相关问题