Elasticsearch多字段聚合

ES中的聚合被分为两大类:Metric和bucket。

在实际的开发工作过程中,会根据不同业务选择不同聚合总类。相对于REST的请求风格,javaApi方面的资料就比较欠缺。官方API都比较片面,实际应用中,要自己去多去尝试,多去组合验证。这点确实是比较累。

已近期的一个业务举例:

需求:根据用户ID来分组获取用户发布的微博,并统计微博的讨论量和转发量等等指标信息,还要根据不同指标信息做相关排序。

从需求描述中可以获悉,用户ID是一个大桶(bucket),讨论量和转发量是嵌套在这个大桶中的小桶。之后再根据不同的小桶做相关排序需求。

部分示例代码如下:

SearchRequestBuilder searcher = getTransportClient().prepareSearch(indice.split(",")) ;
        searcher.setSearchType(SearchType.COUNT);
        searcher.setQuery(getFilteredQueryBuilder(query)) ;
        //约束好不同的桶命名
        TermsBuilder groupTermsBuilder = AggregationBuilders.terms("groupTerms").field("mediaUsers").size(size);
        TermsBuilder docTermsBuilder = AggregationBuilders.terms("docTerms").field("docId");
        TermsBuilder polarTermsBuilder = AggregationBuilders.terms("polarTerms").field("polar");
        SumBuilder commentsTermsBuilder = AggregationBuilders.sum("commentsTerms").field("commentCount");    //评论数   
        SumBuilder repostsTermsBuilder = AggregationBuilders.sum("repostsTerms").field("repostsCount");     //转发数   
        SumBuilder activeTermsBuilder = AggregationBuilders.sum("activeTerms").field("activeCount");        //互动数
        SumBuilder exposureTermsBuilder = AggregationBuilders.sum("exposureTerms").field("exposureCount") ;    //曝光指数

 

//开始嵌套组装不同的桶

 

groupTermsBuilder.subAggregation(docTermsBuilder)
                        .subAggregation(polarTermsBuilder)
                       .subAggregation(commentsTermsBuilder)
                       .subAggregation(repostsTermsBuilder)
                       .subAggregation(activeTermsBuilder)
                       .subAggregation(exposureTermsBuilder) ;
    searcher.addAggregation(groupTermsBuilder.order(order)) ;

 

//之后从大桶开始做遍历,获取相关聚合指标信息

while(groupBucketIt.hasNext()){
            IEAnaysisData anaysisData = new IEAnaysisData() ;
            Bucket groupBucket = groupBucketIt.next();

.......

附上相关资料链接:http://www.cnblogs.com/xing901022/p/4944043.html,以方便了解的更深刻。

 

 

 

猜你喜欢

转载自primernd.iteye.com/blog/2301043