Elasticsearch 高级查询:全文检索与结构化数据查询的结合使用
- 一、前言
- 二、核心概念
- 1. 全文检索(match)
- 2. 结构化查询(term / range / terms)
- 3. 两者结合 = **bool 查询**
- 三、全文检索 + 结构化查询 结合流程图
- 四、核心语法(必须背会)
- 五、为什么 must + filter 是最优组合?
- 六、真实业务案例(直接可用)
- 需求:
- 最终查询 DSL:
- 七、日志场景结合查询(超级常用)
- 八、Mapping 必须这样设计(关键!)
- 九、最常见的 4 个错误(90%的人中招)
- 1. 把结构化过滤写在 must 里
- 2. 用 text 字段做精确过滤
- 3. 不用 bool 组合
- 4. 全文与结构化混用
- 十、总结(超级好记)
- Elasticsearch 最标准查询模型:
- 一句话口诀:
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在实际业务中(电商搜索、日志检索、内容平台、订单搜索),几乎 100% 的查询都是“全文搜索 + 结构化过滤”的组合。
例如:
- 搜索标题包含“手机”(全文检索)
- 并且是华为品牌(结构化)
- 价格 1000-3000(结构化)
- 状态上架(结构化)
只使用全文检索,结果不准;
只使用结构化查询,没有搜索体验。
两者结合,才是 Elasticsearch 的真正威力!
二、核心概念
1. 全文检索(match)
- 对文本分词
- 用于标题、内容、描述
- 字段类型:text
2. 结构化查询(term / range / terms)
- 不分词、完全匹配
- 用于状态、ID、枚举、数字、日期、城市、品牌
- 字段类型:keyword / integer / boolean / date
3. 两者结合 =bool 查询
- must:全文搜索(打分)
- filter:结构化过滤(不打分、高性能)
这就是 ES最强大、最常用、最标准的查询模型!
三、全文检索 + 结构化查询 结合流程图
四、核心语法(必须背会)
{"query":{"bool":{"must":[// 全文检索(关键词搜索){"match":{"title":"手机"}}],"filter":[// 结构化查询(精确/范围/等值过滤){"term":{"brand":"华为"}},{"range":{"price":{"gte":1000,"lte":3000}}},{"term":{"status":1}}]}}}五、为什么 must + filter 是最优组合?
must(全文)
负责相关性、分词、搜索、打分filter(结构化)
负责快速过滤、不计算分数、自动缓存
性能比 must 高5~10 倍
✅最佳实践:全文放 must,过滤放 filter!
六、真实业务案例(直接可用)
需求:
- 搜索标题包含“电动车”(全文)
- 品牌是雅迪/爱玛(结构化 terms)
- 价格 1000~5000(结构化 range)
- 状态=上架(结构化 term)
- 库存>0(结构化 range)
最终查询 DSL:
GET /goods/_search { "query": { "bool": { "must": [ { "match": { "title": "电动车" // 全文搜索 } } ], "filter": [ { "terms": { "brand": ["雅迪","爱玛"] // 多值过滤 } }, { "range": { "price": { "gte":1000, "lte":5000 } } }, { "term": { "status": 1 } }, { "range": { "stock": { "gt": 0 } } } ] } } }七、日志场景结合查询(超级常用)
- 全文检索:message 包含“NullPointerException”
- 结构化:level=ERROR
- 结构化:serviceName=order-service
- 结构化:最近 1 小时
GET /logs-*/_search { "query": { "bool": { "must": [ { "match": { "message": "NullPointerException" } } ], "filter": [ { "term": { "level": "ERROR" } }, { "term": { "serviceName": "order-service" } }, { "range": { "timestamp": { "gte": "now-1h" } } } ] } } }八、Mapping 必须这样设计(关键!)
要想全文检索 + 结构化查询同时生效,字段必须使用multi-fields:
"title":{"type":"text",// 全文检索"fields":{"keyword":{"type":"keyword"// 结构化排序/聚合/精确匹配}}}- 全文搜:
title - 精确/排序:
title.keyword
九、最常见的 4 个错误(90%的人中招)
1. 把结构化过滤写在 must 里
→ 性能差、浪费资源
✅结构化必须写 filter
2. 用 text 字段做精确过滤
→ 查询不准、查不到
✅精确查询必须用 keyword
3. 不用 bool 组合
→ 无法实现复杂业务
✅必须使用 bool 组合查询
4. 全文与结构化混用
→ 业务混乱
✅全文用 match,结构化用 term/range/terms
十、总结(超级好记)
Elasticsearch 最标准查询模型:
全文检索(match) + 结构化过滤(filter) = 完美查询
一句话口诀:
关键词搜索放 must,
精确范围放 filter,
text 负责全文搜,
keyword 负责结构化,
bool 一组合,万能查询就搞定!
🌺The End🌺点点关注,收藏不迷路🌺 |