es聚合

本文详细介绍如何使用Elasticsearch的Java API进行复杂的数据聚合查询,包括计算球队球员数量、球员年龄统计、球队薪资总额及平均年龄等。通过对比SQL查询语句,深入解析ES的Terms、Max、Min、Sum、Avg等聚合函数的使用方法。

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

https://www.cnblogs.com/xionggeclub/p/7975982.html

如要计算每个球队的球员数,如果使用SQL语句,应表达如下:

select team, count(*) as player_count from player group by team;
ES的java api:

TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
sbuilder.addAggregation(teamAgg);
SearchResponse response = sbuilder.execute().actionGet();
group by多个field
例如要计算每个球队每个位置的球员数,如果使用SQL语句,应表达如下:

select team, position, count(*) as pos_count from player group by team, position;
ES的java api:

TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
TermsBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");
sbuilder.addAggregation(teamAgg.subAggregation(posAgg));
SearchResponse response = sbuilder.execute().actionGet();
max/min/sum/avg
例如要计算每个球队年龄最大/最小//平均的球员年龄,如果使用SQL语句,应表达如下:

select team, max(age) as max_age from player group by team;
ES的java api:

TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
MaxBuilder ageAgg= AggregationBuilders.max("max_age").field("age");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg));
SearchResponse response = sbuilder.execute().actionGet();
对多个field求max/min/sum/avg
例如要计算每个球队球员的平均年龄,同时又要计算总年薪,如果使用SQL语句,应表达如下:

select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team;
ES的java api:

TermsBuilder teamAgg= AggregationBuilders.terms("team");
AvgBuilder ageAgg= AggregationBuilders.avg("avg_age").field("age");
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg).subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
聚合后对Aggregation结果排序
例如要计算每个球队总年薪,并按照总年薪倒序排列,如果使用SQL语句,应表达如下:

select team, sum(salary) as total_salary from player group by team order by total_salary desc;
ES的java api:

TermsBuilder teamAgg= AggregationBuilders.terms("team").order(Order.aggregation("total_salary ", false);
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
需要特别注意的是,排序是在TermAggregation处执行的,Order.aggregation函数的第一个参数是aggregation的名字,第二个参数是boolean型,true表示正序,false表示倒序。 

Aggregation结果条数的问题
默认情况下,search执行后,仅返回10条聚合结果,如果想反悔更多的结果,需要在构建TermsBuilder 时指定size:

TermsBuilder teamAgg= AggregationBuilders.terms("team").size(15);
 

Aggregation结果的解析/输出
得到response后:

Map<String, Aggregation> aggMap = response.getAggregations().asMap();
StringTerms teamAgg= (StringTerms) aggMap.get("keywordAgg");
Iterator<Bucket> teamBucketIt = teamAgg.getBuckets().iterator();
while (teamBucketIt .hasNext()) {
Bucket buck = teamBucketIt .next();
//球队名
String team = buck.getKey();
//记录数
long count = buck.getDocCount();
//得到所有子聚合
Map subaggmap = buck.getAggregations().asMap();
//avg值获取方法
double avg_age= ((InternalAvg) subaggmap.get("avg_age")).getValue();
//sum值获取方法
double total_salary = ((InternalSum) subaggmap.get("total_salary")).getValue();
//...
//max/min以此类推
}
### 使用Elasticsearch聚合功能 #### 设置环境并执行基本聚合查询 为了利用Elasticsearch的强大聚合能力,首先需要确保已安装配置好Elasticsearch集群,并通过RESTful API接口与其交互。对于简单的聚合操作,比如基于单个字段进行统计汇总,可以直接构建`terms`类型的聚合查询。 ```json GET /es_db/_search { "size": 0, "aggs": { "hs_remark_agg": { "terms": { "field": "remark.keyword" } } } } ``` 上述命令展示了如何创建一个仅返回聚合结果而不展示具体文档详情的请求[^4]。这里设置了`size: 0`来指示服务器忽略具体的匹配项而专注于聚合部分的结果集处理。 #### 多字段复合聚合实现 当涉及到多个维度的同时分析时,则可采用更复杂的结构——即所谓的“桶内嵌套”。这允许在一个更大的分类下进一步细分数据点。例如,在测试案例中验证了多字段组合的有效性[^1]: ```json POST /your_index_name/_search?size=0 { "query": {}, "aggs": { "composite_aggregation_example": { "composite": { "sources": [ {"source_field_1": {"terms": {"field": "field_one"}}}, {"source_field_2": {"terms": {"field": "field_two"}}} ] } } } } ``` 这段JSON定义了一个名为`composite_aggregation_example`的新聚合器实例,其中包含了两个源字段作为分组依据。这种设计非常适合于探索不同属性之间的关系以及它们共同影响下的分布情况。 #### 应用场景举例说明 实际应用方面,Elasticsearch的聚合特性广泛适用于各类数据分析需求。无论是追踪用户行为轨迹还是评估产品性能表现,亦或是研究人力资源状况等都能找到合适的解决方案[^2]。例如,可以通过聚合获取某段时间内的平均响应时间、最常访问页面路径或者是最高收入的商品类别等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值