如何在Elasticsearch查询中合并terms聚合桶并自定义返回key名称
可以通过Elasticsearch原生查询实现该需求,无需在客户端做二次聚合处理,核心方案是使用Painless脚本改造terms聚合的分组逻辑,在ES计算聚合的阶段就完成指定桶的合并。
实现原理
在terms聚合中使用自定义脚本替代直接指定字段:判断country字段值如果为KR、JP、US三者之一,就统一返回NEW_RESULT作为分组key,其余值直接返回原值作为分组key,ES会自动按脚本返回的key做桶聚合,天然得到合并后的统计结果。
改造后的完整查询语句
GET /_search { "size" : 0, "query" : { "ids" : { "types" : [ ], "values" : [ "someId1", "someId2", "someId3" ... ] } }, "aggregations" : { "how_to_merge" : { "terms" : { "script": { "lang": "painless", "source": "def c = doc['country'].value; return ['KR','JP','US'].contains(c) ? 'NEW_RESULT' : c;" }, "size" : 50 } } } }
性能说明
该方案使用的Painless脚本是ES原生支持的轻量脚本语言,聚合阶段执行效率极高,不会额外增加过多查询开销,完全可以满足大数据量场景下的性能要求。
内容的提问来源于stack exchange,提问作者nkhcode
相关产品推荐
相关产品推荐

