elasticsearch中多个字段聚合及java实现
引言
假设需要将a,b,c三个字段进行聚合(做笛卡儿积)的话,有两种方法:
1、大桶套小桶,通过terms一层层聚合
这个方法适用于需要统计每一项的数据,比如a中有多少种b
此方法再次不表
2、函数扩展(script)聚合
这个方法适用于直接统计有多少种组合
博主新人一个,只谈方法不深入,将来有研究再更新
es版本5.6
参考
https://blog.csdn.net/qq_28988969/article/details/84337405
https://blog.csdn.net/weixin_41279060/article/details/78852704
es查询语句
{ "query": { "match_all": {} }, "size": 0, "aggs": { "app": { "terms": { //聚合的key用####分隔 "script": "doc['appInfo.appName'].values +'####'+doc['appInfo.appVersion'].values+'####'+doc['device'].values", "size": 5 } } } }
结果
代码版:

{ "took": 5, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 650, "max_score": 0, "hits": [ ] }, "aggregations": { "app": { "doc_count_error_upper_bound": 5, "sum_other_doc_count": 190, "buckets": [ { "key": "[sdklib]####[1.0]####[Android]", "doc_count": 173 } , { "key": "[开源中国]####[2.4]####[Android]", "doc_count": 150 } , { "key": "[sss]####[1.0]####[Android]", "doc_count": 77 } , { "key": "[ProguardTest]####[1.0]####[Android]", "doc_count": 34 } , { "key": "[My Application]####[1.0]####[Android]", "doc_count": 26 } ] } } }
JavaAPI
Script script = new Script("doc['anrType'].values +'####'+ doc['anrMessage'].values"); TermsAggregationBuilder app = AggregationBuilders.terms("app").script(script).size(10000); //用于统计每一项详细数据 CardinalityAggregationBuilder app = AggregationBuilders.cardinality("app").script(script).precisionThreshold(10000); //用于统计有多少项
标签:
elasticsearch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能