【问题标题】:Elasticsearch MultiMatch query matches only the last termElasticsearch MultiMatch 查询仅匹配最后一个词
【发布时间】: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_namename.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


【解决方案1】:

试试这个,可能对你有帮助:-

Query_string 比 multi_match 更强大。link

{
  "query": {
    "query_string": {
       "fields" : ["admin0_name*", 
            "admin0_alternate_names*", 
            "local_admin_name*", 
            "locality_name*", 
            "locality_alternate_names*", 
            "neighborhood_name*", 
            "street_name*", 
            "housenumber*", 
            "housenumber_exact*", 
            "name.text*"] ,
      "query": "*екатеринбург*" OR "*тимирязева*"
    }
  }
}

这里是我的分析,query_string如何在部分搜索中更强大link

【讨论】:

  • 我会试一试,看起来非常强大的构造,但我的问题不在于确切的解决方法,而是更多关于我如何制作multi_match
  • 检查这个链接,它告诉你多重匹配 abd query_string stackoverflow.com/questions/15423033/…
  • 这是一个强大的功能,但我找不到关于如何计算 query_string 的相关性的消息。而且我认为它与带有一些子查询的布尔查询相同。但我想使用这里描述的混合词频 elastic.co/guide/en/elasticsearch/reference/current/… 如果我可以混合词频,boolean_queryquery_string 适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多