Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch match_phrase 查询

Elasticsearch(es) 查询语句语法详解 Elasticsearch(es) 查询语句语法详解


elasticsearch 的 match_phrase 查询是全文查询,主要用于需要的 query 词的顺序与全文匹配中的顺序一致,这是基于 lucene 索引中存储的 term 在 doc 中出现的 position 信息来判断的;它首先会把 query 内容分词,分词器可以自定义,同时文档还要满足以下两个条件才会被搜索到,一是分词后所有词项都要出现在指定字段中,二是字段中的词项顺序要一致。match_phrase 查询的底层实现是 span query,span query 一般不常用。

查询语法结构

GET /_search
{
  "query": {
    "match_phrase": {
      "field_name": {
        "query": "query string",
        "slop": 2,
        "boost": 10.0,
        "analyzer": "my_analyzer"
      }
    }
  }
}

match_phrase 查询同样可写成一种类型为 phrase 的 match 查询:

GET /_search
{
  "query": {
    "match": {
      "field_name": {
        "query": "query string",
        "type": "phrase"
      }
    }
  }
}

参数

field_name

这里的 field_name 是替换描述词,不是实际的词,指定要匹配的字段名称。需要注意的是,如果只指定需要查询的 query 文本,field_name 对应的要查询的文本即可,如下:

GET /_search
{
  "query": {
    "match_phrase": {
      "field_name": "query string"
    }
  }
}

query

需要查询的 query 文本,如上语法结构,它属于 field_name 对应的对象里。

slot

match_phrase 是精确匹配,默认(slot 为 0)时,要求分词后所有词项与 doc 中出现的相对顺序位置一样。

当然使用 slot 可以将精确匹配的条件放宽,slot 的意义是需要移动一个 term 多少次才能使得 query 跟 doc 完全匹配,主要有两种情况,一是缺失某些 term,二是 term 一致,但是顺序不一致,都需要 slot 来控制。需要注意的是,两个 term 交换位置,slot=2。

boost

对应查询项的加权值。

analyzer

指定当前 query 所对应的分词分析器(需要当前 elasticsearch 支持)。

应用场景

match_phrase 查询主要的应用场景如下:

  • 对匹配项的前后顺序有要求的 case,如检索专利号等。