Elasticsearch Composite聚合能否去除doc_count等字段仅返回目标值
解决方案
Elasticsearch 原生聚合返回的结构固定,无法直接输出你期望的纯数组格式,但可以通过以下两步快速实现需求:
步骤1:使用filter_path参数过滤冗余响应
在请求URL中添加filter_path参数,只保留你需要的字段,彻底去掉took、超时状态、分片信息、命中结果等冗余内容:
请求URL示例:
POST /你的索引名/_search?filter_path=aggregations.*.buckets.key.my_stoid
请求DSL保持你原有写法即可:
{ "aggs": { "my_buckets": { "composite": { "size": 10000, "sources": [{ "my_stoid": { "terms": { "field": "stoId" } } } ] } } }, "size": 0 }
此时返回的响应会精简为以下结构:
{ "aggregations" : { "composite#my_buckets" : { "buckets" : [ { "key" : { "my_stoid" : "1" } }, { "key" : { "my_stoid" : "2102" } } ] } } }
步骤2:客户端简单映射得到目标格式
对返回的精简结果做一层简单的遍历映射即可得到你要的数组,不同语言实现逻辑一致,以下是JavaScript示例:
const stoIdList = result.aggregations['composite#my_buckets'].buckets.map(item => item.key.my_stoid)
最终得到的stoIdList就是["1", "2102", "8000", "9999", "KB", "KV"]的格式。
注意事项
如果你的stoId唯一值总数量超过了请求中设置的size:10000,需要结合响应返回的after_key做分页拉取,才能拿到全量的唯一值。
内容的提问来源于stack exchange,提问作者huha
相关产品推荐
相关产品推荐

