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