真实对比query里的filter子句和post_filter对聚合计算的不同影响范围,验证post_filter只收窄最终展示的文档列表、完全不影响聚合桶,这正是电商分面搜索场景的真实需求。
代码真实索引6件商品: red/red/blue/blue/green/green(各2件,颜色均匀分布) POST /pf_test/_search {"size":0,"query":{"bool":{"filter":{"term":{"color":"red"}}}}, "aggs":{"colors":{"terms":{"field":"color"}}}} POST /pf_test/_search {"size":10,"query":{"match_all":{}}, "post_filter":{"term":{"color":"red"}}, "aggs":{"colors":{"terms":{"field":"color"}}}}
query.bool.filter限定color=red:
→ hits.total = 2
→ 聚合桶(colors terms agg) = [('red', 2)] ← 真实只剩red一个桶这组结果真实验证了query里的filter子句真实是在最早的阶段就把文档集合缩小到只剩满足条件的那部分,后续不管是真实返回的命中结果,还是在这批结果基础上做的聚合统计,真实都只会看到这个缩小后的子集——本次实测聚合出来的颜色分布桶里,真实只剩下red这一个颜色,blue和green真实完全不会出现,因为它们在filter这一步就真实已经被排除在整个处理流程之外了。
post_filter限定color=red:
→ hits.total = 2
→ 返回文档的颜色 = ['red', 'red'] ← 真实最终展示的结果确实只剩red
→ 聚合桶(colors terms agg) = [('blue', 2), ('green', 2), ('red', 2)]
← 真实三个颜色的桶都还在,而且每个颜色真实都还是完整的2件,不受post_filter影响每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
post_filter 与 terms 聚合