ElasticSearch match_phrase短语匹配

说明

Match Phrase 是 Elasticsearch 中一种精确短语匹配查询。它要求被检索的文档中,必须包含查询短语中的所有分词,并且这些分词要按照查询时的顺序连续出现(或在一定位置距离内)。这与普通的 match 查询不同,后者只要求包含所有分词即可,顺序无关。

使用场景

  1. 精确短语搜索:用户需要搜索特定的短语,如书名、名言、专有名词等。

    • 例如:搜索 “To be or not to be”,确保返回的是包含这个完整短语的文档。
  2. 排除歧义结果:当普通 match 查询返回太多不相关结果时,使用 match_phrase 可以提高精准度。

    • 例如:搜索 “apple watch”,match 可能返回包含 “apple” 和 “watch” 但不相关的文档,而 match_phrase 会确保是 “apple watch” 这个产品相关的内容。

Match Phrase vs Match vs Match Phrase Prefix

查询类型 特点
match 分词匹配,不要求顺序,最宽松
match_phrase 分词必须按顺序连续出现(或按 slop 允许的偏移),精准度高
match_phrase_prefix 与 match_phrase 类似,但最后一个分词支持前缀匹配(如 “quick brow” 匹配 “quick brown”)

字段类型

应用在 text 类型上

如果是 keyword 类型,相当于精确查询,必须完全一致才能查询到

例子

例子

查询 title 中包含 java mysql 的所有记录,不分词,并给出响应得分

GET /toutiao_v1/_search
{
  "query": {
    "match_phrase": {
      "title": "java mysql"
    }
  }
}

执行结果:

{
    "took":12,
    "timed_out":false,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":{
            "value":1,
            "relation":"eq"
        },
        "max_score":1.0314758,                  // 最大匹配的分值
        "hits":[
            {
                "_index":"toutiao_v2",
                "_type":"_doc",
                "_id":"mN1I5nsByvoeiV4PSu3M",
                "_score":1.0314758,               // 匹配的分值
                "_source":{
                    "title":"JAVA mysql技巧大全",
                    "content":"JAVA mysql技巧大全",
                    "author":"李雷",
                    "like":528,
                    "date":"2021-08-29"
                }
            }
        ]
    }
}

解释:

  • 这个查询会匹配 title 字段中包含连续的 java mysql 的文档,不区分大小写
  • 默认按照匹配分值从大到小排列

查询条件与结果越接近,分值越高

GET /toutiao_v1/_search
{
    "query":{
        "match_phrase":{
            "title":"JAVA  mysql技巧大全"
        }
    }
}

执行结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 5.1300077,
    "hits" : [
      {
        "_index" : "toutiao_v1",
        "_type" : "_doc",
        "_id" : "jF-h1H8BcF98mmCagx8w",
        "_score" : 5.1300077,                //分值明显提高
        "_source" : {
          "title" : "JAVA mysql技巧大全",
          "content" : "JAVA mysql技巧大全",
          "author" : "李雷",
          "like" : 528,
          "date" : "2021-08-29",
          "type" : "java"
        }
      }
    ]
  }
}

参数:slop

slop 参数定义了分词之间允许的位置偏移量,用来控制匹配的宽松程度。

GET /my_index/_search
{
  "query": {
    "match_phrase": {
      "content": {
        "query": "quick fox",
        "slop": 1
      }
    }
  }
}

解释:

  • slop: 1 表示分词之间可以有 1 个位置的间隔。
  • 此时,”quick brown fox” 会被匹配(因为 “quick” 和 “fox” 之间隔了一个词)。
  • slop 值越大,匹配越宽松。

总结

  • match_phrase 的核心是“顺序”和“连续性”:它确保查询的分词在文档中按指定顺序出现,是实现精确短语检索的关键。
  • slop 参数是灵活调整的工具:通过设置偏移量,可以在精准和灵活之间取得平衡。
  • 适用场景:需要精确匹配短语、专有名词或特定句式时,优先使用 match_phrase。

原文出处:/show_1IX1rdTsnVpx.html