根据文档,ES中disable_coord的默认值为false。我找不到有关如何将此参数设置为true会影响搜索结果的详细说明。
根据文档,ES中disable_coord的默认值为false。我找不到有关如何将此参数设置为true会影响搜索结果的详细说明。
这是协调因素。
如果启用了coord因子(默认情况下为“disable_coord”:false)则为 手段: 如果我们在文本中有更多搜索关键字,那么此结果将更具相关性并将获得更高的分数。
如果禁用coord因子(“disable_coord”:true)则表示: 没有 无论我们在搜索文本中有多少关键字,它都会被计算在内 一旦。
您可以找到更多细节 这里。
这是协调因素。
如果启用了coord因子(默认情况下为“disable_coord”:false)则为 手段: 如果我们在文本中有更多搜索关键字,那么此结果将更具相关性并将获得更高的分数。
如果禁用coord因子(“disable_coord”:true)则表示: 没有 无论我们在搜索文本中有多少关键字,它都会被计算在内 一旦。
您可以找到更多细节 这里。
它用于lucene得分。在得分结果的同时,
例 如果我想修改任何bool查询的coord分数,那么整个 如果某个特定子句或文本或值匹配,则查询将乘以2。
如果有 N
bool查询中的子查询具有相同的提升/权重 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
part_2 = 2/3=0.66
(66%) Smax
。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
与启用协调时相同part_2₂ = 4/9=0.44
(44%) Smax₂
。或者比2/3更小(66%) part_2
part_1₂ = 1/9=0.11
(11%) Smax₂
。或者比1/3小(33%) part_1
不同的协调方法相互比较:得分何时 disable_coord=False
小于时得分 disable_coord=True
通过 (n²/N²)/(n/N) = n/N
时
具有不同协调策略的不同查询类型的可能用例:
请注意,当术语在文档中多次出现时,相同的子查询可能会有不同的分数:这是由term_frequency控制的(https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html#tf) - 它不受影响 disable_coord
在另一个答案中说的是什么(https://stackoverflow.com/a/26998760/952437)。字段长度标准化也会影响结果的计算方式
如果您想知道这3个概念如何协同工作,请参阅以下示例:
查询: 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 =假:
~=3*1/(sqrt(4))*const = 3*tmp_const
~=(1+1*sqrt(2)+1)*1/(sqrt(4))*const = 3.41 * tmp_const
~=(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
。由于协调,分数较低~=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(反向文档频率)。上面的示例假设所有术语在索引中具有相同的频率。
假设您有一个should子句,其中您有三个查询,现在假设一个文档与第一个bool查询匹配,那么它将得到一些分数,但假设此查询与第二个查询不完全匹配但部分匹配,现在这个文档将给出一些比特分数额外意味着(第一个查询匹配分数+第二个查询部分匹配分数)。
现在,如果您不希望在查询中给出这个部分分数,那么您应该写“disable_coord”:true它将执行的操作只会根据完全匹配查询而不是部分匹配来为文档分数。我希望你现在得到它......... :)