执行聚合
聚合提供了数据的组合和提取的能力。想想聚集最简单的方法是将其大致等同于SQL GROUP BY和SQL聚合函数。在Elasticsearch,你拥有执行的搜索返回命中的能力,同时匹配和返回汇总结果也都在同一个返回相应中。你可以操作一次性避免网络往返,运行查询和多个聚合并得到两个(或两者以上)的结果返回,这是非常强大和有效的,使用起来简洁和简化的API。
看下面,这个例子组中有美国各州所有的帐户,然后以计数下降(默认)返回前10个(默认)州进行分类:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state"
}
}
}
}'
在SQL中,上面聚集概念类似于这样:
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
响应(部分示例):
"hits" : {
"total" : 1000 ,
"max_score" : 0.0 ,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"buckets" : [ {
"key" : "al" ,
"doc_count" : 21
}, {
"key" : "tx" ,
"doc_count" : 17
}, {
"key" : "id" ,
"doc_count" : 15
}, {
"key" : "ma" ,
"doc_count" : 15
}, {
"key" : "md" ,
"doc_count" : 15
}, {
"key" : "pa" ,
"doc_count" : 15
}, {
"key" : "dc" ,
"doc_count" : 14
}, {
"key" : "me" ,
"doc_count" : 14
}, {
"key" : "mo" ,
"doc_count" : 14
}, {
"key" : "nd" ,
"doc_count" : 14
} ]
}
}
}
我们可以看到,有21个账户在AL(ABAMA)中,然后TX 中有17个账户,随后15个账户中在ID(AHO),等等。
请注意,我们设置的大小size=0为不显示搜索命中,因为我们只希望看到在响应中聚集的结果。
在前一个聚合的基础上,这个例子中(再次仅通过数量降序排列的前10国)计算由国家平均的账户余额:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}'
注意我们是如何嵌套在average_balance里面聚集group_by_state聚集。这是所有聚合的通用模式。你可以嵌套聚合、内部聚合,从您的数据中任意提取需要的核心总结。
在前一个聚合的基础上,现在让我们来对平均余额降序排序:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}'
此示例演示,我们可以按年龄段(20-29岁,30-39岁,40-49岁和),然后按性别,最后得到的平均账户余额,每个年龄段,性别进行分组:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_gender": {
"terms": {
"field": "gender"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}'
在这里,我们不会细讲这里其他很多聚合功能。该聚合参考指南是一个很好的起点,如果你想要做进一步实验的话。