zoukankan      html  css  js  c++  java
  • 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);
    //用于统计有多少项
  • 相关阅读:
    js实现全选反选功能
    seajs笔记
    延迟加载图片
    JavaScript 数组基本操作
    图片上传,头像上传
    命令模式
    动态加载js css 插件
    发布-订阅模式
    js 切换全屏
    JavaScript 经典之一 闭包
  • 原文地址:https://www.cnblogs.com/end-emptiness/p/10315133.html
Copyright © 2011-2022 走看看