Elasticsearch多字段聚合

本文介绍了在Elasticsearch中使用Java API进行多字段聚合的方法,通过示例代码展示了如何根据用户ID分组并统计微博的讨论量、转发量等指标,以及如何对这些指标进行排序。在实际应用中,需要灵活组合和验证不同的聚合操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,以方便了解的更深刻。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值