真实对比query层bool.filter收窄整个请求所有聚合范围的行为,与filter聚合作为独立bucket节点能在同一次请求里并存整体视图与筛选后视图的真实差异,揭示filter聚合在对照统计场景下的真实价值。
代码真实索引5篇文档: active 3篇(cat=a,a,b) / inactive 2篇(cat=a,b) query层filter限定: POST /fa_test/_search {"query":{"bool":{"filter":{"term":{"status":"active"}}}}, "aggs":{"by_cat":{"terms":{"field":"cat"}}}} filter聚合: POST /fa_test/_search {"query":{"match_all":{}},"aggs":{ "overall_by_cat":{"terms":{"field":"cat"}}, "active_only":{"filter":{"term":{"status":"active"}},"aggs":{"by_cat":{"terms":{"field":"cat"}}}} }}
query里bool.filter限定status=active: → by_cat桶: a(2) b(1) ← 真实只统计到了active范围内的3篇文档
这跟本系列第57篇验证过的query层filter行为真实完全一致:一旦在query里加了过滤条件,这个条件真实会作用到整个请求的每一个部分,聚合真实只能看到过滤之后剩下的那部分文档,没有办法在同一个请求里再拿到"过滤之前"的整体统计。
query整体不过滤(match_all),用filter聚合单独圈出active范围: overall_by_cat(真实全部5篇,两种状态都算在内): → a(3) b(2) active_only.by_cat(真实只统计filter聚合圈出的active这3篇): → a(2) b(1) active_only这个filter桶本身的doc_count: 3
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
filter 聚合与query层 bool.filter