根据文档,ES中disable_coord的默认值是false。我找不到关于将此参数设置为true将如何影响搜索结果的详细解释。
baubqpgj1#
这是协调因素。
更多细节你可以在这里找到。
kpbpu0082#
如果bool查询中有N子查询具有相同的提升/权重,则disable_coord=true将遵循下一个逻辑...假设:
N
disable_coord=true
n
当n子查询匹配时:总得分将与匹配查询的提升/权重之和成比例。因为我们现在假设权重/提升相等,这将是:Sn = n*const。当所有子查询都匹配时(n=N):Smax = N*const部分匹配与完全匹配相比将为part_of_max = Sn / Smax = (n*const) / (N*const) = n/N例如,如果你有3个子查询:
Sn = n*const
n=N
Smax = N*const
part_of_max = Sn / Smax = (n*const) / (N*const) = n/N
Smax
part_2 = 2/3=0.66
part_1 = 1/3=0.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个子查询:
n/N
Sn₂ = n*n/N * const = n²/N * const
Smax₂ = N*(N/N)*const = N * const
part_of_max₂ = Sn₂ / Smax₂ = (n²/N * const) / (N * const) = n²/N²
Smax₂
part_2₂ = 4/9=0.44
part_2
part_1₂ = 1/9=0.11
part_1
不同协调方法之间的比较:disable_coord=False的得分小于disable_coord=True乘以(n²/N²)/(n/N) = n/N的得分具有不同协调策略的不同查询类型的可能用例:
disable_coord=False
disable_coord=True
(n²/N²)/(n/N) = n/N
请注意,当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:
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
~=2*1/(sqrt(1))*const = 2*2*tmp_const ~= 4*tmp_const
disable_coord=False:
~=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
~=2*1/(sqrt(1))*const * 1/3 = 2*2*tmp_const * 1/3 ~= 1.33*tmp_const
真实的分数也取决于IDF(倒排文档频率)。上面的例子假设所有的术语在索引中具有相同的频率。
sirbozc53#
它用于Lucene评分。在对结果进行评分时,示例如果我想修改任何bool查询的coord score,使得如果某些特定的子句或文本或值匹配,整个查询将乘以2。
atmip9wb4#
假设你有一个should子句,其中有三个查询,现在假设一个文档匹配第一个bool查询,那么它会得到一些分数,但是假设这个查询不完全匹配第二个查询,而是部分匹配,现在这个文档会得到一些额外的分数,这意味着(第一个查询匹配分数+第二个查询部分匹配分数)。现在,如果你不想在你的查询中给出这个部分分数,那么你应该写“disable_coord”:true它会做什么,它只会根据完全匹配的查询而不是部分匹配的文档给出分数。我希望你现在得到它...:)
4条答案
按热度按时间baubqpgj1#
这是协调因素。
更多细节你可以在这里找到。
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
Smax
的part_2 = 2/3=0.66
(66%)。Smax
的part_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
,与启用协调时相同Smax₂
的part_2₂ = 4/9=0.44
(44%)。或者比part_2
小2/3(66%)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
的得分具有不同协调策略的不同查询类型的可能用例:
请注意,当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:
~=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(倒排文档频率)。上面的例子假设所有的术语在索引中具有相同的频率。
sirbozc53#
它用于Lucene评分。在对结果进行评分时,
示例如果我想修改任何bool查询的coord score,使得如果某些特定的子句或文本或值匹配,整个查询将乘以2。
atmip9wb4#
假设你有一个should子句,其中有三个查询,现在假设一个文档匹配第一个bool查询,那么它会得到一些分数,但是假设这个查询不完全匹配第二个查询,而是部分匹配,现在这个文档会得到一些额外的分数,这意味着(第一个查询匹配分数+第二个查询部分匹配分数)。
现在,如果你不想在你的查询中给出这个部分分数,那么你应该写“disable_coord”:true它会做什么,它只会根据完全匹配的查询而不是部分匹配的文档给出分数。我希望你现在得到它...:)