Bool 查询是什么
bool 查询是 Elasticsearch DSL 的组合器:must 参与打分、filter 不计分且结果可被缓存、should 用于提权或「至少满足其一」、must_not 做排除。日志检索里绝大多数条件只承担筛选职责,把它们放进 filter 既符合语义又更省资源,是性能与正确性兼顾的常规写法。
基本信息
| 子句 | must / filter / should / must_not |
|---|---|
| must | 参与相关性打分 |
| filter | 不计分,可缓存,适合筛选 |
| should | 提权;无 must/filter 时至少满足一个 |
| must_not | 排除,不参与打分 |
| 适用场景 | 日志检索、条件组合查询 |
典型使用场景
- 按服务、时间范围与关键字组合检索日志
- 排除测试环境或特定主机的日志,聚焦生产问题
- 按状态码与耗时区间筛选慢请求
- 在多个可选条件里用 should 做加权排序
- 用 filter 包裹范围查询,让结果集可被缓存以加速重复检索
- 构造「必须 A 且 B,且不能是 C」这类审计查询
典型组合
典型组合
GET /logs-app/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "service.keyword": "api" } },
{ "range": { "@timestamp": { "gte": "now-1h" } } }
],
"must": [ { "match": { "message": "timeout" } } ],
"must_not": [ { "term": { "env.keyword": "test" } } ]
}
},
"size": 20
}子句对照
| 子句 | 是否打分 | 典型用途 |
|---|---|---|
| must | 是 | 需要相关排序的文本匹配 |
| filter | 否(可缓存) | 精确筛选:服务、时间、状态码 |
| should | 是 | 提权或「至少满足其一」 |
| must_not | 否 | 排除干扰数据 |
只做筛选不做相关性排序的条件放 filter:结果集可被缓存,长查询更省资源,日志检索基本以 filter 为主。
should 的行为取决于上下文:存在 must 或 filter 时 should 只影响打分,不存在时至少要满足一个子句,语义差异容易误判。
文本字段与 keyword 子字段要分清:term 查询应针对 keyword,match 查询针对分词后的 text,混用会查不到数据。
子句数量过多会显著增加查询开销,能用一次范围查询表达的不要拆成多个 term 条件。
filter 里的条件可以配 constant_score 固定评分,或把相同过滤的查询合成一份以复用缓存。
minimum_should_match 能显式控制 should 的满足数量,比依赖隐式规则更清晰,尤其在同时存在 filter 时。