(九):ElasticSearch聚合查询(Aggregation aggs)
聚合查询文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-aggregations.html。
聚合查询与Mysql中的 group by 类似,可以实现对数据统计、分析。如热点商品、销量等信息。
ElasticSearch实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果。
聚合查询的语法规则:
"aggregations" : { "<aggregation_name>" : { "<aggregation_type>" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggregations" : { [<sub_aggregation>]+ } ]? } [,"<aggregation_name_2>" : { ... } ]* }
1、基本概念
Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫 `桶`,一个叫 `度量`:
1.1、bucket - 桶(分组)
按照某种方式对数据进行分组,每一组数据在ES中称为一个"桶"。如按照年龄段对人进行划分:0~10,10~20,20~30,30~40等。
Elasticsearch中提供了很多划分桶的方式,这里列举部分划分桶的方式。如:
Date Histogram Aggregation |
日期阶梯分组,如给定阶梯为月,会自动每月分为一组 |
Histogram Aggregation |
数值阶梯分组 |
Terms Aggregation |
根据词条内容分组,词条内容完全匹配的为一组 |
Range Aggregation |
数值和日期的范围分组,指定开始和结束,然后按段分组 |
bucket aggregations 只负责对数据进行分组,不会进行计算。若要获得统计的数据,bucket中需要嵌套另一种聚合,metrics aggregations 即度量。
1.2、metrich - 度量(运算)
bucket aggregations分组完成后,会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些处理在ES中称为 metrich 度量。常见的度量聚合方式:
Avg Aggregation |
平均值 |
Max Aggregation |
最大值 |
Min Aggregation |
最小值 |
Percentiles Aggregation |
百分比 |
Stats Aggregation |
同时返回avg、max、min、sum、count等 |
Sum Aggregation |
求和 |
Top hits Aggregation |
求前几 |
Value Count Aggregation |
求总数 |
2、聚合案例
2.1、搜索address中包含Street的所有人的年龄分布及平均年龄
# 搜索address中包含Street的5个人的年龄分布及平均年龄
GET /items/_search
{
"query": {
"match": {
"address": "Street"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 3
}
},
"ageAvg":{
"avg": {
"field": "age"
}
}
},"size": 0
}
按照年龄聚合,并计算所有人的年龄分布,聚合时会显示满足条件的记录,size设置为0,就不会显示记录。

2.2、搜索各年龄段的平均薪资
# 按 age 聚合,获取各年龄段的平均工资
GET /items/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 3
},
"aggs": {
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
},"size": 0
}
2.3、查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
# 查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET /items/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 2
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword",
"size": 2
},
"aggs": {
"genderBalanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
,"ageBalanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
}, "size": 0
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)