测试数据请看上一篇博客“笔记(一)”
聚合的格式一般为
{
"aggs":{
"my_agg_name":{
...
}
}
}
1.若是
{
"aggs":{
"my_agg_name":{
"terms":{
"field":"city"
}
}
}
}
相当于
SELECT city,COUNT(*) FROM table GROUP BY city; #分组聚合,会返回buckets
2.若是
{
"aggs":{
"my_agg_name":{
"avg":{
"field":"money"
}
}
}
}
相当于
SELECT AVG(money) FROM table; #度量聚合,会返回一个value
3.若是
{
"aggs":{
"my_agg_name":{
"terms":{
"field":"city"
},
"aggs":{
"my_child_agg_name":{
"avg":{
"field":"money"
}
}
}
}
}
}
相当于
SELECT city,AVG(money) FROM table GROUP BY city; #分组聚合,会返回buckets,每个bucket里有一个度量聚合
对比1和3,
SELECT city,COUNT(*) FROM table GROUP BY city; #分组聚合,会返回buckets
SELECT city,AVG(money) FROM table GROUP BY city; #分组聚合,会返回buckets,每个bucket里有一个度量聚合
SQL语句差不多,一个是统计每组记录数,一个是统计每组钱的平均值,
但1只用了一次聚合,3在聚合里用了一个子聚合
4.重点,并列的子聚合!
{
"aggs":{
"my_agg_name":{
"terms":{
"field":"city"
},
"aggs":{
"my_child_agg_name":{
"avg":{
"field":"money"
}
},
"my_child_agg_name2":{
"max":{
"field":"money"
}
}
}
}
}
}
相当于
SELECT city,AVG(money),MAX(money) FROM table GROUP BY city; #分组聚合,会返回buckets
结论:并列的子聚合之间其实没有一点关系,都是对上一级的结果进行再操作。
再举个例子:
{
"aggs":{
"my_agg_name":{
"filter":{ //过滤,查找所有
"query": {
"match_all": {}
}
},
"aggs":{
"name1_0":{ //并列的子聚合互不影响,对上一级的结果进行操作,按age分组,包含key是15和2的桶(只有15的桶)
"terms":{
"field":"age",
"include":[15,2]
}
},
"name1_4":{ //并列的子聚合互不影响,对上一级的结果进行操作,先过滤出年龄是15的,再按money分组(得到5个桶)
"filter":{
"query": {
"term": {
"age": 15
}
}
},
"aggs":{
"name1_4_0":{
"terms":{
"field":"money"
}
}
}
},
"name1_5":{ //并列的子聚合互不影响,对上一级的结果进行操作,先过滤出钱是4000的,再按age分组(得到1个桶)
"filter":{
"query": {
"term": {
"money": 4000
}
}
},
"aggs":{
"name1_5_0":{
"terms":{
"field":"age"
}
}
}
}
}
}
}
}
可以在笔记(一)插入的数据中跑跑上述代码,加深理解。