【问题标题】:Elasticsearch: disable coordination factor for multi match queryElasticsearch:禁用多匹配查询的协调因子
【发布时间】:2015-04-14 17:30:56
【问题描述】:

我在每个字段上使用具有不同权重的多重匹配查询。 我将 tie_breaker 设置为 1 以禁用 use_dis_max 并使用总和而不是分数的最大值。

GET index_name/index_type/_search?explain
{
 "size": 1,
  "query": {
  "multi_match": {
   "query": "ticket",
   "fields": ["title^9", "descr^4", "*section_body"],
   "tie_breaker": 1
  }
 }
}

ES 将每个字段的分数相加,然后将其乘以协调因子。

我想禁用协调因素,所以我尝试将我的多重匹配查询包装成一个 bool 查询并将 disable_coord 设置为 true,如下所示:

GET index_name/index_type/_search?explain
{
  "size": 1,
  "query": {
    "bool": {
       "disable_coord": true,
       "should": [
         {
          "multi_match": {
          "query": "ticket",
          "fields": ["title^9", "descr^4", "*section_body"],
          "tie_breaker": 1
           }
         }
      ]
    }
 }
}

但我可以看到评分公式没有任何变化,ES 仍在将所有不同字段的分数相加,然后将结果乘以协调因子。

如何禁用协调因素?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我建议将should 的各个条件分开并单独提升它们。这可能类似于以下内容:

    {
      "size": 1,
      "query": {
        "bool": {
          "disable_coord": true,
          "should": [
            {"match" : {"title" : {"query" : "ticket", "boost" : 9}}},
            {"match" : {"descr" : {"query" : "ticket", "boost" : 4}}},
            {"multi_match" : {
              "fields" : ["*section_body"],
              "query" : "ticket"
            }}
          ]
        }
      }
    }
    

    对于我收集的一组愚蠢的测试数据,看起来这确实导致不再应用协调因子,即当disable_coordtrue 时,每个文档的结果得分都高于true设置为false

    【讨论】:

    • 感谢您的回答。我的目标是尽可能减少所有“*section_body”字段的权重,而您的解决方案就是这样做的。但是,我的搜索场景之一是“所有单词匹配”。在这种情况下,我使用类型设置为“best_fields”且运算符设置为“AND”的多匹配查询。我可以对这种情况应用相同的逻辑并将我的多匹配查询分成匹配查询列表吗?
    • 它也应该在这种情况下工作。无论如何,multi_match 查询将作为特定于字段的match 查询的集合执行——只是multi_match 表单似乎抽象出了禁用协调的能力。如果这是您的目标,您将不得不直接使用分解后的表单(多个 match 查询)。 elasticsearch.org/guide/en/elasticsearch/reference/current/…
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多