Elasticsearch如何使用字符串数组对数组字段执行agg过滤统计
Elasticsearch 数组字段指定值聚合统计方案
你可以通过两种不需要正则的方式实现需求,直接传入目标字符串值数组即可过滤聚合结果:
方案1:Terms聚合精确值数组匹配(最简实现)
Terms聚合的include参数支持两种模式,除了正则匹配外还支持传入精确值数组,不会触发正则解析,刚好符合你的使用要求:
POST /你的索引名称/_search { "size": 0, // 不需要返回原始文档,仅返回聚合结果 "aggs": { "specified_color_stats": { "terms": { "field": "colors.keyword", // 必须使用keyword类型字段做精确值聚合 "include": ["red"] // 直接传入你需要统计的目标值数组,可扩展任意多个值 } } } }
按照你提供的样例数据,返回结果中specified_color_stats的buckets仅会出现red的统计结果,数值为3,其他颜色值会被自动排除。
方案2:Filters聚合(适合自定义统计场景)
如果你需要为每个统计值自定义bucket名称、或者附加额外过滤条件,可以使用Filters聚合:
POST /你的索引名称/_search { "size": 0, "aggs": { "custom_color_stats": { "filters": { "filters": { "red_total": { "term": { "colors.keyword": "red" } }, // 可扩展其他需要统计的值,例如 "purple_total": { "term": { "colors.keyword": "purple" } } } } } } }
返回结果中每个自定义key对应的doc_count就是该值的命中文档数。
注意事项
- 统计必须使用字段的keyword类型,如果使用text类型字段会导致分词后匹配错误,无法统计到准确的精确值结果。
- 两种方案均不需要编写正则,直接传入目标字符串值即可,不会匹配到无关的其他值。
内容的提问来源于stack exchange,提问作者BuffaloDev
相关产品推荐
相关产品推荐

