Elasticsearch核心查询:精准匹配 vs 全文检索匹配(区别+原理+流程图+选型)
- 一、前言
- 二、Elasticsearch 精准匹配与全文检索匹配:基础定义
- 2.1 精准匹配(Exact Matching)
- 2.2 全文检索匹配(Full-text Matching)
- 三、核心工作原理流程图(直观理解区别)
- 3.1 精准匹配 工作流程图(term查询)
- 3.2 全文检索匹配 工作流程图(match查询)
- 3.3 一句话原理区别
- 四、精准匹配 vs 全文检索匹配:8大核心区别(必背)
- 4.1 是否分词(最本质区别)
- 4.2 依赖字段类型
- 4.3 查询结果特点
- 4.4 性能
- 4.5 适用场景
- 4.6 大小写敏感
- 4.7 核心API
- 4.8 结果排序
- 五、直观对比示例(一看就懂)
- 5.1 测试数据
- 5.2 精准匹配查询(term)
- 5.3 全文检索查询(match)
- 六、实战语法大全
- 6.1 精准匹配语法(term/terms)
- 1. 单值精准匹配
- 2. 多值精准匹配(IN查询)
- 6.2 全文检索语法(match)
- 1. 单字段全文检索
- 2. 多字段全文检索
- 七、字段类型与查询匹配规则(避坑核心)
- 7.1 经典踩坑
- 八、使用场景选型指南
- 8.1 必须使用精准匹配(term)的场景
- 8.2 必须使用全文检索(match)的场景
- 九、总结:核心区别口诀
- 文末总结
- 总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 查询开发中,精准匹配和全文检索匹配是最常用、最容易混淆的两种查询方式。
90%的新手踩坑都是因为:搞不清两者区别、用错查询方式、字段类型不匹配,导致查不到数据、查询不准确、性能极慢等问题。
本文从定义、原理、流程图、字段依赖、核心区别、使用场景、实战示例全方位讲解,让你彻底掌握两种查询,写出最优ES查询语句。
二、Elasticsearch 精准匹配与全文检索匹配:基础定义
2.1 精准匹配(Exact Matching)
精准匹配:查询词不分词、不分析,与文档字段原值完全一致时才命中,追求完全相等。
核心API:term、terms、match_phrase(严格短语)
2.2 全文检索匹配(Full-text Matching)
全文检索匹配:查询词先分词,再与文档分词后的词语任意匹配,追求相关度,返回相关性最高的结果。
核心API:match、multi_match、query_string
三、核心工作原理流程图(直观理解区别)
3.1 精准匹配 工作流程图(term查询)
3.2 全文检索匹配 工作流程图(match查询)
3.3 一句话原理区别
精准匹配 = 整体匹配,完全相等
全文检索 = 分词匹配,包含即可
四、精准匹配 vs 全文检索匹配:8大核心区别(必背)
4.1 是否分词(最本质区别)
- 精准匹配:不分词,查询串作为整体匹配
- 全文检索:必须分词,先拆分再查询
4.2 依赖字段类型
- 精准匹配:依赖keyword 字段
- 全文检索:依赖text 字段
4.3 查询结果特点
- 精准匹配:完全一致才返回,无相关性评分
- 全文检索:包含任意词就返回,按相关性评分排序
4.4 性能
- 精准匹配:极快,底层倒排索引直接定位
- 全文检索:较慢,需要分词、匹配、打分、排序
4.5 适用场景
- 精准匹配:状态、ID、枚举、手机号、姓名、城市等值
- 全文检索:文章、标题、描述、评论、内容搜索
4.6 大小写敏感
- 精准匹配:大小写敏感(
A≠a) - 全文检索:大小写不敏感(会统一转为小写)
4.7 核心API
- 精准匹配:
term、terms - 全文检索:
match、multi_match
4.8 结果排序
- 精准匹配:不计算得分,默认按文档ID排序
- 全文检索:计算得分,按相关性排序
五、直观对比示例(一看就懂)
5.1 测试数据
文档字段:city: keyword(北京、上海市、广州市)title: text(北京天气、上海疫情、北京旅游)
5.2 精准匹配查询(term)
GET /index/_search { "query": { "term": { "city": "北京" // 完全一致才命中 } } }✅ 命中:city=北京
❌ 不命中:city=北京市、city=北京区
5.3 全文检索查询(match)
GET /index/_search { "query": { "match": { "title": "北京天气" // 分词为北京、天气 } } }✅ 命中:包含北京或天气的所有文档
六、实战语法大全
6.1 精准匹配语法(term/terms)
1. 单值精准匹配
GET /user/_search { "query": { "term": { "phone": "13800138000" } } }2. 多值精准匹配(IN查询)
GET /user/_search { "query": { "terms": { "city": ["北京", "上海", "广州"] } } }6.2 全文检索语法(match)
1. 单字段全文检索
GET /article/_search { "query": { "match": { "content": "Elasticsearch 教程" } } }2. 多字段全文检索
GET /product/_search { "query": { "multi_match": { "query": "手机", "fields": ["name", "desc"] } } }七、字段类型与查询匹配规则(避坑核心)
| 查询方式 | 支持字段类型 | 不支持字段类型 | 后果 |
|---|---|---|---|
| 精准匹配 term | keyword | text | 查不到数据 |
| 全文检索 match | text | keyword | 无效,相当于精准匹配 |
7.1 经典踩坑
- 用 term 查询 text 字段→ 查不到数据
- 用 match 查询 keyword 字段→ 变成精准匹配
- 查询词大小写错误→ term 查询无结果
八、使用场景选型指南
8.1 必须使用精准匹配(term)的场景
- 用户ID、订单ID、手机号精确查询
- 状态值过滤:
status=1、is_delete=0 - 枚举值过滤:性别、城市、类型
- 不需要分词、必须完全相等的场景
- 聚合、排序、统计场景
8.2 必须使用全文检索(match)的场景
- 文章内容搜索、标题搜索
- 商品名称模糊搜索
- 评论、描述、日志检索
- 需要智能匹配、相关度排序的场景
九、总结:核心区别口诀
- 精准匹配:不分词、整体相等、查keyword、速度极快、精确
- 全文检索:分词、包含即可、查text、速度稍慢、智能相关
- text 字段用 match
- keyword 字段用 term
- 精准查状态ID,全文搜内容描述
文末总结
精准匹配和全文检索是 Elasticsearch 的两大核心查询体系。
- 精准匹配(term)= 精确、快速、不分词、查keyword
- 全文检索(match)= 模糊、智能、分词、查text
只要记住字段类型+查询方式对应规则,就能彻底避免查询错误,写出高性能ES语句。
总结
- 本质区别:精准匹配不分词,全文检索分词
- 字段区别:精准匹配用
keyword,全文检索用text - API区别:精准匹配
term,全文检索match - 性能区别:精准匹配极快,全文检索较慢
- 场景区别:精准查ID/状态,全文搜内容/标题
🌺The End🌺点点关注,收藏不迷路🌺 |