聚合查询可以想象成就是mysql的group by分组查询,使用聚合函数min,max,sum,avg进行聚合,返回的是一条数据
聚合的模板
聚合查询
一个aggs里可以有很多个聚合,每个聚合彼此间都是独立的
以下语句的含义就是查询出爱好是网吧的数据,然后对age字段进行最小值,最大值,平均值的获取
GET /ems/_search?size=0 ##如果有些情况不在意查询结果是什么,而只在意aggs的结果,可以把size设为0,如此可以让返回的hits结果集是0,加快返回的速度
{
"query": {
"match": {
"hobby": "网吧"
}
},
"aggs": {
"max_age": {
"max": {
"field": "age"
}
},
"min_age": {
"min": {
"field": "age"
}
},
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
执行结果:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"max_age" : {
"value" : 30.0
},
"avg_age" : {
"value" : 18.333333333333332
},
"min_age" : {
"value" : 12.0
}
}
}
聚合中常用的桶 terms、filter
说白了这些桶其实就是对已经查询出来的数据再进行细粒度的二次查询,然后取出细粒度查询出来的最小值,最大值,平均值,和或者总条数等等
Terms桶
GET /ems/_search?size=0
{
"query": {
"match_all": {}
},
"aggs": {
"max_age": {
"max": {
"field": "age"
}
},
"min_age": {
"min": {
"field": "age"
}
},
"avg_age": {
"terms": {
"field": "hobby" #根据hobby进行分组,并获取分组之后最小的年龄
},
"aggs": {
"in_avg_age": {
"min": {
"field": "age"
}
}
}
}
}
}
执行结果:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 6,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"max_age" : {
"value" : 30.0
},
"avg_age" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "网吧",
"doc_count" : 3,
"in_avg_age" : {
"value" : 12.0
}
},
{
"key" : "k8s运维大佬",
"doc_count" : 2,
"in_avg_age" : {
"value" : 18.0
}
},
{
"key" : "前端大佬",
"doc_count" : 1,
"in_avg_age" : {
"value" : 19.0
}
}
]
},
"min_age" : {
"value" : 12.0
}
}
}
Filter桶(带子聚合)
GET /ems/_search?size=0
{
"query": {
"match_all": {}
},
"aggs": {
"max_age": { //获取最大年龄
"max": {
"field": "age"
}
},
"min_age": { //获取最小年龄
"min": {
"field": "age"
}
},
"avg_age": { //子聚合:获取hobby为k8s运维大佬数据中年龄最小的的
"filter": {
"bool": {
"must":{
"match":{
"hobby":"k8s运维大佬"
}
}
}
},
"aggs": {
"in_avg_age": {
"min": {
"field": "age"
}
}
}
}
}
}
执行结果:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 6,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"max_age" : {
"value" : 30.0
},
"avg_age" : {
"doc_count" : 2,
"in_avg_age" : {
"value" : 18.0
}
},
"min_age" : {
"value" : 12.0
}
}
}