2020-09-01

es~通过ElasticsearchTemplate进行聚合~嵌套聚合

之前写过《es~通过ElasticsearchTemplate进行聚合操作》的文章,这一次主要写一个嵌套的聚合,例如先对sex集合,再对desc聚合,最后再对age求和,共三层嵌套。
Aggregations的部分特性类似于SQL语言中的group by,avg,sum等函数,Aggregations需要理解两个概念:

  • 桶(Buckets):符合条件的文档的集合,相当于SQL中的group by。按"性别"聚合,一个人将被分到男桶或女桶
  • 指标(Metrics):基于Buckets的基础上进行统计分析,并进行计算,大多数metric是数学计算,仅输出一个值,min/max/avg/sum/cardinality,部分metric支持输出多个数值,stats(统计)/percentiles(百分比)/percentile_ranks

嵌套聚合写法

 // 创建一个查询条件对象  BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();  // 拼接查询条件  queryBuilder.should(QueryBuilders.termQuery("creator", "1"));  // 创建聚合查询条件  TermsAggregationBuilder sexAgg = AggregationBuilders    .terms("sex")    .field("sex.keyword");//keyword表示不使用分词进行聚合,全字匹配  TermsAggregationBuilder descAgg = AggregationBuilders    .terms("desc")    .field("desc.keyword");//keyword表示不使用分词进行聚合,全字匹配  SumAggregationBuilder ageSumAgg = AggregationBuilders    .sum("ageSum")    .field("age");  //嵌套  descAgg.subAggregation(ageSumAgg);  sexAgg.subAggregation(descAgg);  // 创建查询对象  SearchQuery build = new NativeSearchQueryBuilder()    .withQuery(queryBuilder) //添加查询条件    .addAggregation(sexAgg) // 添加聚合条件    .withPageable(PageRequest.of(0, 1)) //符合查询条件的文档分页,如果文档比较大,可以把这个分页改小(不是聚合的分页)    .build();  // 执行查询  AggregatedPage<TestEsDto> testEntities = elasticsearchTemplate.queryForPage(build, TestEsDto.class);  // 取出聚合结果  Aggregations entitiesAggregations = testEntities.getAggregations();  Terms terms = (Terms) entitiesAggregations.asMap().get("sex");  // 遍历取出聚合字段列的值,与对应的数量  for (Terms.Bucket bucket : terms.getBuckets()) {   Terms descTerms = (Terms) bucket.getAggregations().asMap().get("desc");   for (Terms.Bucket descTermsBucket : descTerms.getBuckets()) {    ParsedSum parsedSum = descTermsBucket.getAggregations().get("ageSum");//注意从bucket而不是searchResponse    System.out.println(bucket.getKeyAsString() + "\t" +      bucket.getDocCount() + "\t" +      descTermsBucket.getKeyAsString() + "\t" +      parsedSum.getValueAsString());   }  }

结果
1

参考:https://www.elastic.co

es~通过ElasticsearchTemplate进行聚合~嵌套聚合菜鸟网络亚马逊运营全攻略分享大会西集网一年实现1000万营业额!90后天猫转型跨境卖家有诀窍?李兰娟|李兰娟新闻资讯及李兰娟报道2020年全国的Q1季度GDP增长如何?疫情间全国GDP降了多少?(精品分析)亚马逊德国站男装上衣类目市场调查数据报告卖家必知:超详细的跨境电商国际物流知识!

No comments:

Post a Comment