说明
Match Phrase 是 Elasticsearch 中一种精确短语匹配查询。它要求被检索的文档中,必须包含查询短语中的所有分词,并且这些分词要按照查询时的顺序连续出现(或在一定位置距离内)。这与普通的 match 查询不同,后者只要求包含所有分词即可,顺序无关。
使用场景
精确短语搜索:用户需要搜索特定的短语,如书名、名言、专有名词等。
- 例如:搜索 “To be or not to be”,确保返回的是包含这个完整短语的文档。
排除歧义结果:当普通
match查询返回太多不相关结果时,使用match_phrase可以提高精准度。- 例如:搜索 “apple watch”,
match可能返回包含 “apple” 和 “watch” 但不相关的文档,而match_phrase会确保是 “apple watch” 这个产品相关的内容。
- 例如:搜索 “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。