Appearance
Elasticsearch Query DSL 实战:搜索、过滤、排序和聚合到底怎么搭配
很多人第一次写 Elasticsearch 查询,会有两个常见问题:
- 语法看起来会了
- 但一到真实搜索场景,就不知道应该怎么组合
真正有价值的不是背 DSL,而是理解:
- 这次查询到底是在做检索、过滤、排序,还是聚合
先说结论
更实用的 Query DSL 思路通常是:
- 先区分搜索条件和过滤条件
- 再明确排序是不是必要
- 聚合尽量和检索目标拆开看
- 查询性能要和 mapping、分片、字段设计一起看
一、搜索和过滤为什么要先分开
因为它们在语义上就不是一回事。
搜索更像是在回答:
- 哪些文档和关键词最相关
过滤更像是在回答:
- 这些条件必须满足
真实项目里,把两类条件混在一起,通常会让查询既难调又难解释。
二、最常见的几种组合场景
1. 商品搜索
通常会同时有:
- 关键词搜索
- 类目过滤
- 品牌过滤
- 价格区间过滤
- 排序
这类场景最容易踩的坑是:
- 过滤条件写成检索条件
- 排序和相关性目标互相打架
2. 日志检索
更多时候是:
- 时间范围过滤
- 服务名过滤
- 错误码过滤
- 少量关键词搜索
这类场景通常更偏过滤,而不是复杂相关性。
三、排序为什么经常变成性能问题
因为一旦加了排序,很多查询就不再只是“找出来”,还要:
- 做额外排序成本
- 或依赖特定字段模型
所以排序要特别警惕:
- 是否真的需要
- 是否和主要目标冲突
四、聚合最容易踩的坑
很多人会把一个请求里同时塞进:
- 检索
- 分页
- 多层聚合
- 多维度排序
这会让请求非常重。
更稳妥的做法通常是:
- 检索和统计口径分场景设计
五、Query DSL 真正应该怎么学
不要按“语法分类”硬背,而要按场景去练:
- 搜索框查询怎么写
- 筛选页怎么写
- 日志页怎么写
- 聚合统计怎么写
这样更容易形成稳定直觉。
一句话总结
Elasticsearch Query DSL 的关键,不是把所有语法都会写,而是先分清:
- 这次请求是要搜索
- 还是过滤
- 还是统计
分清目标后,DSL 组合就会清楚很多。