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
            }
            ]
        }
    }
}
View Code

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);
//用于统计有多少项

 

转载于:https://www.cnblogs.com/end-emptiness/p/10315133.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值