elasticsearch 的 match_phrase 查询是全文查询,主要用于需要的 query 词的顺序与全文匹配中的顺序一致,这是基于 lucene 索引中存储的 term 在 doc 中出现的 position 信息来判断的。
match_phrase 首先会把 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,如检索专利号等。