bigywater.tech
Elasticsearch · 83

filters 聚合

真实用两个会重叠的命名条件验证filters聚合允许同一篇文档被同时计入多个桶,这跟terms聚合强制互斥分组的行为完全不同,并用other_bucket参数精确补全未命中任何分支的文档统计。

high_value与is_vip两个命名桶
真实各自统计出2件,加起来超过了真实的3件
重叠的根源
真实一件商品同时满足两个条件被重复计入
other_bucket:true
真实精确补全了两个条件都不满足的那2件商品

做的事:真实索引5件商品,用filters聚合定义两个会真实重叠的命名分支条件

代码真实索引5件商品: {price:500,vip:true} / {price:50,vip:true} / {price:500,vip:false} / {price:30,vip:false} / {price:20,vip:false} POST /fs_multi/_search {"size":0,"aggs":{"f":{"filters":{"filters":{ "high_value":{"range":{"price":{"gte":100}}}, "is_vip":{"term":{"vip":true}} }}}}}

验证:两个命名桶的doc_count真实加起来超过了总文档数,证明一件商品真实被同时计入了两个桶

实测 · 本机 Elasticsearch 8.15.0 执行输出
high_value桶: doc_count=2   (真实price=500的那两件,vip状态不管)
is_vip桶:     doc_count=2   (真实vip=true的那两件,price高低不管)
两桶加起来: 2+2=4,但索引总共只有5件商品

这组真实数字揭示了filters聚合最核心的特性:不同于本系列第72篇验证过的terms这类"每篇文档只能归入唯一一个桶"的互斥分组方式,filters聚合真实允许同一篇文档真实同时满足多个命名分支的条件,从而被真实重复计入这些桶各自的统计里——本次实测里那件price=500且vip=true的商品,真实既满足high_value的条件(price>=100),又满足is_vip的条件(vip=true),所以真实在这两个桶里各被统计了一次,不是只能二选一。

真实加上other_bucket:true,看能不能单独统计出两个条件都不满足的商品

代码POST /fs_multi/_search {"size":0,"aggs":{"f":{"filters":{"other_bucket":true,"other_bucket_key":"rest","filters":{ "high_value":{"range":{"price":{"gte":100}}}, "is_vip":{"term":{"vip":true}} }}}}}

验证:真实多出的rest桶精确统计出了2件两个条件都不满足的商品,三桶之和真实超出总数的那一份正好等于重复计入的那件商品

实测 · 本机执行输出
high_value: 2
is_vip:     2
rest:       2   ← 真实两个条件都不满足的那两件(price30/vip false 和 price20/vip false)

三桶之和: 2+2+2=6,比总数5真实多出1
  ← 这多出来的1,正好对应那件被high_value和is_vip同时统计了一次的商品
这组真实数字精确地验证了filters聚合桶之间真实允许重叠这件事:加上other_bucket之后,rest桶真实准确捕获了两个命名条件都不满足的2件商品,剩下满足至少一个条件的文档理论上应该是5-2=3件,但high_value和is_vip两个桶真实分别统计出2件,加起来是4件——比真实的3件多出1,这多出来的1正是那件price=500且vip=true的商品真实被同时计入两个桶造成的重复计数。这个真实的重叠特性正是filters聚合的核心价值所在:它天生适合统计那些业务定义上本来就可能互相交叉的分类(比如"高价值用户"和"VIP用户"这两个标签真实经常同时适用于同一个人),如果业务需要的就是这种有重叠的多维度交叉统计,filters聚合真实比强制互斥分组的terms更贴合实际语义;但如果统计口径上不希望同一篇文档被重复计入多个桶,使用前就需要真实确保各个命名分支的过滤条件本身互斥,不能简单假设filters聚合会像terms那样自动帮你做互斥划分。

分步演示:filters聚合从验证桶重叠到other_bucket补全未命中文档的完整过程

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

filters聚合的命名分支真实允许重叠,一篇文档可以被同时计入多个桶
这一步新验证的filters聚合特性

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 filters 聚合与 other_bucket 参数
    京ICP备2026067502号-1京公网安备11010502063487号