ElasticSearch multi_match

抽取最高分 Disjunctive Max Score

DELETE /demo

PUT /demo/_doc/1
{
    "title": "Quick brown rabbits",
    "body":  "Brown rabbits are commonly seen."
}

PUT /demo/_doc/2
{
    "title": "Keeping pets healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}

doc2 的 body 同时出现了 brown fox, 理应更匹配, 但是他的 title 中没有任何匹配. should 含有多个条件, 导致最后归总的时候, doc2 的得分不占优势.
针对这种情况, 应该选 doc2 中 body 属性的值来跟其他文档比较, 即, 取最优得分.

GET /demo/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "brown fox"
          }
        },
                {
          "match": {
            "body": "brown fox"
          }
        }
      ]
    }
  }
}

只看最高分的属性:

GET /demo/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "title": "brown fox"
          }
        },
        {
          "match": {
            "body": "brown fox"
          }
        }
      ]
    }
  }
}

只看最高分有点过于武断, 如果还需要适当考虑非最高分的属性的影响, 可调这两个参数:

    "dis_max": {
      "boost": 1.2,
      "tie_breaker": 0.1, 
  • boost 用来调整最高分属性影响;
  • tie_breaker 用来调整非最高分属性的影响;

以上检索被归纳到 multi_match 下:

GET /demo/_search
{
  "query": {
    "multi_match": {
      "query": "brown fox",
      "fields": ["*"]
    }
  }
}
multi_match type purpose
best_fields 默认值. 各属性分别检索, 算分只选最高分.
相当于 dis_max
most_fields 各属性分别检索, 算分加总.
相当于 bool: {should: []}
phrase phrase_prefix 使用短语检索规则的 best_fields
cross_fields 类似于在 _all 上检索

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_cross_fields_queries.html

你可能感兴趣的:(ElasticSearch multi_match)