Elasticsearch多字段聚合查询

最近用到es做人群画像,原始数据是带标签的pin包,为了方便查询,对数据做了预处理,按标签做聚合,由于标签的数量不固定,所以想起来用递归实现多字段聚合(三个及三个以上字段),源码在此,方便大家参阅。类似group by field1,field2,field3...

Note:groupFields存放聚合的字段

List<String> groupFields = new ArrayList<>();
groupFields.add("字段1");
groupFields.add("字段2");
groupFields.add("字段3");
TermsBuilder termsBuilder = AggregationBuilders.terms(groupFields.get(0)).field(groupFields.get(0)).size(100);
subAgg(groupFields, termsBuilder, 0);
SearchResponse response = client.prepareSearch(INDEX_NAME).addAggregation(termsBuilder).setSize(0).execute().actionGet(60000);
Terms terms = response.getAggregations().get(groupFields.get(0));
for (Terms.Bucket bucket : terms.getBuckets()) {
     StringBuilder builder = new StringBuilder();
     builder.append(bucket.getKey()).append("\t");
     resolveResult(bucket, groupFields, builder);
}
//拼装聚合条件
private void subAgg(List<String> list, TermsBuilder termsBuilder, int count) {
        if (count < list.size() - 1) {
            count ++;
            TermsBuilder termsBuilder1 = AggregationBuilders.terms(list.get(count)).field(list.get(count)).size(GROUP_SIZE);
            termsBuilder.subAggregation(termsBuilder1);
            subAgg(list, termsBuilder1, count);
        }
    }
//聚合结果解析
private void resolveResult(Terms.Bucket bucket, List<String> list, StringBuilder keys) {
        boolean flag = false;
        for (String field : list) {
            Terms terms = bucket.getAggregations().get(field);
            if (terms != null) {
                for (Terms.Bucket bucket1 : terms.getBuckets()) {
                    StringBuilder keys1 = new StringBuilder();
                    keys1.append(keys).append(bucket1.getKey()).append("\t");
                    resolveResult(bucket1, list, keys1);
                }
                flag = true;
                break;
            }
        }
        if (!flag) {
            String record = 
            LOGGER.info("keys = {}", keys);
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,992评论 19 139
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,041评论 2 89
  • 跟简书的故事 看简书3个月了,我记得下载这个App是经一个微博博主推荐,这3个月我看了很多简书作者的文章,让我意外...
    刘小强啊阅读 139评论 0 0
  • 文/逐梦水乡 昨天傍晚时分,简书消息提醒“您已成为专题《首页投稿》的编辑。” 哈哈,看到消息那刻,我震惊了,何德何...
    逐梦水乡阅读 6,590评论 103 109
  • 我爱海 蓝色的自由 但我更要 死在河里 回家,回家 我出生的地方 我就是我 凶猛又温柔的 大马哈鱼
    我心飞翔lijing阅读 312评论 0 2