首页/云/可观测性速查/Bool 查询:组合检索条件
日志平台52 条

Bool 查询:组合检索条件

bool 查询是 DSL 组合器:must 计分、filter 不计分且可缓存、should 提权、must_not 排除;日志查询把过滤条件放 filter 性能更好。

可观测性速查云更新于 2026-10-13

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 时。

易错点

  • filter 与 must 的差异在打分与缓存,日志检索一般以 filter 为主
  • should 在无 must/filter 时至少要满足一个才返回文档,容易误解语义
  • 对 text 字段用 term 查询会因分词差异查不到数据,需要指向 keyword 子字段
  • must_not 不参与打分但会消耗计算,大范围排除条件应尽量提前收窄
  • 把时间范围写成字符串而非 range 查询会让筛选失效或报错,时间字段必须用范围语法
  • 忘记设置 minimum_should_match 时 should 的语义随上下文漂移,查询结果难以预期

数据来源与参考

  • Elastic 官方文档 · Bool query
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌