【发布时间】:2017-09-09 00:43:25
【问题描述】:
我有多个字段的多重匹配查询:
{
"multi_match": {
"query": ["екатеринбург", "тимирязева"],
"fields": [
"admin0_name^1.0",
"admin0_alternate_names^0.95",
"local_admin_name^0.6",
"locality_name^1.2",
"locality_alternate_names^1.15",
"neighborhood_name^0.3",
"street_name^1.4",
"housenumber^1.4",
"housenumber_exact^1.5",
"name.text^2.0"],
"type": "most_fields",
"_name": "main_search_query"
}
}
术语екатеринбург 应该匹配locality_name 和тимирязева 应该匹配street_name 和name.text。
但查询解释显示只有 тимирязева 匹配:
1.0168997 = (MATCH) product of:
5.0844984 = (MATCH) sum of:
3.4778461 = (MATCH) weight(name.text:тимирязева^2.0 in 233899) [PerFieldSimilarity], result of:
3.4778461 = score(doc=233899,freq=2.0), product of:
0.39484683 = queryWeight, product of:
2.0 = boost
9.965216 = idf(docFreq=184, maxDocs=1447823)
0.019811254 = queryNorm
8.808089 = fieldWeight in 233899, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
9.965216 = idf(docFreq=184, maxDocs=1447823)
0.625 = fieldNorm(doc=233899)
1.6066521 = (MATCH) weight(street_name:тимирязева^1.4 in 233899) [PerFieldSimilarity], result of:
1.6066521 = score(doc=233899,freq=2.0), product of:
0.22453468 = queryWeight, product of:
1.4 = boost
8.095495 = idf(docFreq=1199, maxDocs=1447823)
0.019811254 = queryNorm
7.1554747 = fieldWeight in 233899, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
8.095495 = idf(docFreq=1199, maxDocs=1447823)
0.625 = fieldNorm(doc=233899)
0.2 = coord(2/10)
为了确保 екатеринбург 本身与 locality_name 匹配,我将该查询与术语查询结合起来,作为 bool 查询的必须部分。匹配。
如果我将查询数组中的术语顺序更改为 ["тимирязева", "екатеринбург"],情况将变为完全相反,екатеринбург 匹配 locality_name 但 тимирязева 不匹配 street_name。
看起来multi_match 只考虑了最后一个术语。
注意我使用的是相当旧的 ES 版本:1.4 是一个错误还是我理解了 multi_match 的工作方式错误?
我可以采用解决方法:使用查询作为字符串而不是作为查询,但我对预标记化方法失败的原因很感兴趣。
【问题讨论】:
-
"Term екатеринбург 应该匹配 locality_name 并且 тимирязева 应该匹配 street_name 和 name.text" 这听起来更像是一个布尔查询,您可以在正确的字段中搜索正确的术语并将其组合起来。虽然语法在当前版本中发生了变化。我强烈建议您升级到当前版本(那些不受支持的版本的文档甚至不再发布)。
-
@xeraa 我不知道数组中哪个术语应该匹配的确切字段。所以查询将是
locality_name:"Екатеринбург Ленина"和street_name:"Екатеринбург Ленина"但对于locality_name只有Екатеринбург会匹配。并且文档说 multi_match 与 cross_fields 正是针对这种情况制作的。布尔查询的问题是如何计算分数:我正好遇到了 n.b. 中提到的问题。这里elastic.co/guide/en/elasticsearch/reference/current/…
标签: elasticsearch