• 引言

      假设需要将a,b,c三个字段进行聚合(做笛卡儿积)的话,有两种方法:

      1、大桶套小桶,通过terms一层层聚合
        这个方法适用于需要统计每一项的数据,比如a中有多少种b
       此方法再次不表

      2、函数扩展(script)聚合
        这个方法适用于直接统计有多少种组合

      博主新人一个,只谈方法不深入,将来有研究再更新

      es版本5.6

    参考

      Elasticsearch多字段分组聚合, 并对分组聚合的count进行筛选_写代码的lorre的博客-CSDN博客_elasticsearch多字段聚合

      elasticsearch系列-ES对多个字段聚合,select A,B,COUNT(*) from table group by A,B_boat824109722的博客-CSDN博客_es聚合多个字段

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

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐