聚合查询文档: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 }
标签:聚合,Aggregation,field,ElasticSearch,aggs,分组,size From: https://www.cnblogs.com/RunningSnails/p/17972959