Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/elasticsearch-multi-match-phrase-and-most-fields-impl.html

elasticsearch(es)如何实现 multi match 多字段的 phrase 匹配且计算分是采用 most fields 模式

Elasticsearch 笔记 Elasticsearch 笔记


我们知道 es 中 multi_match 是多字段的 match 匹配模式,且默认情况下,计算分是采用 best_fields 模式,但如果要采用多字段是 match_phrase 匹配模式,同时计算分采用 most_fields 模式,那该如何解决呢?

这时,大家可能都会想到 multi_match 的 type 类型除了 best_fields、most_fields 等外,还有一个 phrase 类型,但它本质上是匹配采用 match_phrase 模式,计算采用 best_fields,并非题目要求。下面给出了实战中比较巧妙的解决方法。

解决方法

如题要求,首先我们不应该执着于在 multi_match 框架下解决这个问题,跳出该形式;其次,大家应该知道 most_fields 模式是将匹配的多个字段的相关分求和(sum)在一起的,所以我们可以将 match_phrase 语句按照字段个数拆分,然后放在 bool 查询的 should 子项里,并设置该 should 的 minimum_should_match 为 1 即可。

具体示例如下:

{
  "query": {
    "bool": {
      "should": [
        { 
          "match_phrase": { 
            "title": { 
              "query": "knowledge dict",
              "boost":4.0
            }
          }
        },
        {
          "match_phrase": {
            "content": {
              "query": "knowledge dict"
            }
          }
        },
        {
          "match_phrase": {
            "tag": {
              "query": "knowledge dict",
              "boost":2.0
            }
          }
        }
      ],
      "minimum_should_match" : "1"
    }
  }
}