ES聚合查询桶聚合

it2024-08-16  36

ElasticSearch(springBoot):

ElesticsearchTemple(ElasticsearchOperations)聚合查询示例

文章目录

ElasticSearch(springBoot):ElesticsearchTemple(ElasticsearchOperations)聚合查询示例 一、Elasticsearch聚合1、TermsAggregation聚合(相当于mysql groupBy)2、聚合内继续聚合3、执行聚合查询 总结

一、Elasticsearch聚合

1、TermsAggregation聚合(相当于mysql groupBy)

es有很多聚合,这里简单讲一下关键字聚合 TermsAggregationBuilder grade_termsAggregationBuilder = AggregationBuilders.terms(“gradeNumberGroupBy”/* 聚合名称任意*/).field(“gradeNumber/根据那个字段分组与es对应字段相同/”).size(20/设置查询字段最多有多少不同的值,默认是10/); 代码如下(示例):

// 按年级分组,统计每个年级人数 TermsAggregationBuilder grade_termsAggregationBuilder = AggregationBuilders.terms("gradeNumberGroupBy"/* 聚合名称任意*/).field("gradeNumber/*根据那个字段分组与es对应字段相同*/").size(20/*设置查询字段最多有多少不同的值,默认是10*/); // 按性别分组,统计男女比例 TermsAggregationBuilder sex_termsAggregationBuilder = AggregationBuilders.terms("sex").field("sex"); // 按民族分组,统计个民族比例 TermsAggregationBuilder nationality_termsAggregationBuilder = AggregationBuilders.terms("nationality").field("nationality").size(58); aggrList.add(nationality_termsAggregationBuilder);

2、聚合内继续聚合

es聚合可内部继续嵌套其他聚合 代码如下(示例): 统计每个年级的男女比例

// 按年级分组,统计每个年级人数 TermsAggregationBuilder grade_termsAggregationBuilder = AggregationBuilders.terms("gradeNumberGroupBy"/* 聚合名称任意*/).field("gradeNumber/*根据那个字段分组与es对应字段相同*/").size(20/*设置查询字段最多有多少不同的值,默认是10*/); // 按性别分组,统计男女比例 TermsAggregationBuilder sex_termsAggregationBuilder = AggregationBuilders.terms("sex").field("sex"); grade_termsAggregationBuilder.subAggregation(sex_termsAggregationBuilder);

3、执行聚合查询

将之前准备的聚合条件加入nativeSearchQueryBuilder,使用elasticsearchOperations.search执行查询

代码如下(示例):

NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); nativeSearchQueryBuilder.addAggregation(grade_termsAggregationBuilder ); // nativeSearchQueryBuilder.withQuery(boolQueryBuilder); // 添加数据筛选条件,在es基础查询中有介绍,可参考(比如想只查2020年入学的学生,可在这里加bool查询条件) NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build(); nativeSearchQuery.setMaxResults(0); // 设置返回文本数,做聚合查询主要是做统计,这里不需要获取具体的哪些记录,故设为0 Aggregations aggregations = this.elasticsearchOperations.search(nativeSearchQuery, Map.class, IndexCoordinates.of("es索引名称")).getAggregations();

aggregations 中包含了聚合结果,层级结构有点复杂,后续需要将聚合结果转换成自己需要的结构,这里就不多讲了。

注意:添加es配置后,elasticsearchOperations自动注入(可参考之前发布的文章) @Autowired public ElasticsearchOperations elasticsearchOperations;

总结

ExtendedStatsAggregationBuilder 聚合可以统计出count,min,max,avg,aum,平方和,方差,标准差,……等数据 ES还有许多聚合,感兴趣可以研究一下

最新回复(0)