聚合查询
原文链接:https://blog.csdn.net/zjun1001/article/details/124536727
平均值、总和、最大、最小、数量
在es中,所有的聚合查询都是放在aggs中进行的。平均值、总和、最大、最小、数量对应的关键字分别是:avg、sum、max、min、value_count
POST /bank/_search{"query": {"match": {"address": "mill"}},"aggs": {"ageAvg": {"avg": {"field": "age"}},"ageSum": {"sum": {"field": "age"}},"ageMax":{"max": {"field": "age"}},"ageMin":{"min": {"field": "age"}},"ageCount":{"value_count": {"field": "age"}}},"size": 0}
分组
分组用到的关键字是terms
POST /bank/_search{"query": {"match": {"address": "mill"}},"aggs": {"ageGroup": {"terms": {"field": "age","size": 3}}},"size": 0}
上面语句中的size:3,指的是分组后,只展示前三个分组内容。size:0,指的是所有query查询结果,也就是原始数据,不需要展示。此外,还可以对分组内容进行排序。
1.分组后,按分组内的文档数量排序
POST /bank/_search{"aggs": {"ageGroup": {"terms": {"field": "age","order": {"_count": "asc"}}}},"size": 0}
2.分组后,按分组字段排序
POST /bank/_search{"aggs": {"ageGroup": {"terms": {"field": "age","order": {"_key": "desc"}}}},"size": 0}
3.显示分组后,文档数量大于60的
POST /bank/_search{"aggs": {"ageGroup": {"terms": {"field": "age","min_doc_count": 60}}},"size": 0}
分组+子聚合
先按age分组,之后统计分组内的平均值和总和。
POST /bank/_search{"query": {"match": {"address": "mill"}},"aggs": {"ageAgg": {"terms": {"field": "age","size": 3},"aggs": {"ageAvg": {"avg": {"field": "age"}},"ageSum": {"sum": {"field": "age"}}}}},"size": 0}
分段分组+子聚合
先按age分组,分成18-28、28-38两组。之后统计各组的最小值和平均值。
POST /bank/_search{"query": {"match": {"address": "mill Road"}},"aggs": {"ageGroup": {"range": {"field": "age","ranges": [{"from": 18,"to": 28},{"from": 28,"to": 38}]},"aggs":{"ageMin":{"min": {"field": "age"}},"ageAve":{"avg": {"field": "age"}}}}},"size": 0}
指定分组+聚合
查询全部,但分组时候,只统计age=30的所有文档的平均值,最大最小等数据,用stats关键字代表。
POST /bank/_search{"aggs": {"ageGroup": {"filter": {"term": {"age": "30"}},"aggs": {"stat": {"stats": {"field": "age"}}}}},"size": 0}
多种聚合结果统一查询
这里的多种聚合,指的是常用的平均值、最大最小、总和等。除了开始讲到的min、max、avg等关键字外,还可以用stats关键字。一个stats就可以包含min/max/avg/sum等。
POST /bank/_search{"query": {"range": {"age": {"gte": 10,"lte": 20}}},"aggs": {"stat": {"stats": {"field": "age"}}},"size": 0}
