match_phrase 是什么
match_phrase 要求查询词按顺序相邻出现:它先对查询串分词,再要求这些词条在文档中按相同顺序、位置相近地出现。slop 参数允许词之间最多错开一定位置总数,用于在保留顺序约束的同时放宽间距。它与 match 的区别在于 match 只要求词条出现,不关心顺序与相邻关系。
基本信息
| 匹配语义 | 所有词条按顺序出现,默认紧邻(slop 0) |
|---|---|
| slop | 允许词条间错位的总距离,值越大越宽松 |
| 相关参数 | analyzer 可覆盖查询期分词器,boost 调整权重 |
| 依赖 | 需要词条位置信息,字段必须索引位置 |
| 对比 | match 无序、term 整词、match_phrase 有序相邻 |
| 适用版本 | Elasticsearch 7.x / 8.x |
典型使用场景
- 短语精确检索:搜「数据安全」而不要「数据」与「安全」分开命中
- 产品名与型号匹配,避免词序颠倒造成误召回
- 引用检索:定位包含完整表述的文档
- 放宽词距:用 slop 容忍插入的修饰词
- 中文短句检索,配合合适分词器提高准确率
- 与 bool 组合:短语命中加分、其他条件过滤
示例
示例
GET /my-index/_search
{
"query": {
"match_phrase": {
"message": {
"query": "quick brown fox",
"slop": 1 # 允许词间错开 1 个位置
}
}
}
}
GET /my-index/_search
{ "query": { "match_phrase": { "title": "数据安全" } } } # 要求按序相邻出现slop 取值效果
| slop | 效果 | 使用建议 |
|---|---|---|
| 0 | 词条必须紧邻且有序 | 最严格的短语匹配 |
| 1 | 允许中间插入一个词 | 容忍少量修饰词 |
| 2 到 3 | 顺序保留但间距更宽 | 长句检索常用区间 |
| 较大值 | 接近放弃短语约束 | 容易引入无关结果 |
slop 按词条位置计算:查询词顺序颠倒且超出 slop 时不会命中;真正需要无序匹配时应改用 match 查询。
slop 设得过大等于放弃短语约束,会返回大量无关文档;先从小值试起,确认召回质量再放宽。
用标准分析器处理中文会按单字切分,短语匹配的效果与预期差距较大;中文场景应确认分词器并用 _analyze 验证切分结果。