# 统计
最后,我们还有一个需求需要完成:可以让老板在职工目录中进行统计。Elasticsearch 把这项功能称作 _汇总 (aggregations)_,通过这个功能,我们可以针对你的数据进行复杂的统计。这个功能有些类似于 SQL 中的 `GROUP BY`,但是要比它更加强大。
例如,让我们找一下员工中最受欢迎的兴趣是什么:
~~~
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
~~~
请忽略语法,让我们先来看一下结果:
~~~
{ ...
"hits": { ... },
"aggregations": {
"all_interests": {
"buckets": [
{ "key": "music","doc_count": 2 },
{ "key": "forestry","doc_count": 1},
{ "key": "sports","doc_count": 1 }
]
}
}
}
~~~
我们可以发现有两个员工喜欢音乐,还有一个喜欢森林,还有一个喜欢运动。这些数据并没有被预先计算好,它们是在文档被查询的同时实时计算得出的。如果你想要查询姓 Smith 的员工的兴趣汇总情况,你就可以执行如下查询:
~~~
GET /megacorp/employee/_search
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
~~~
这样,`all_interests` 的统计结果就只会包含满足查询的文档了:
~~~
...
"all_interests": {
"buckets": [
{
"key": "music",
"doc_count": 2
},
{
"key": "sports",
"doc_count": 1
}
]
}
~~~
汇总还允许多个层面的统计。比如我们还可以统计每一个兴趣下的平均年龄:
~~~
GET /megacorp/employee/_search
{
"aggs" : {
"all_interests" : {
"terms" : { "field" : "interests" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}
~~~
虽然这次返回的汇总结果变得更加复杂了,但是它依旧很容易理解:
~~~
...
"all_interests":
{
"buckets": [
{
"key": "music",
"doc_count": 2,
"avg_age": {
"value": 28.5
}
},
{
"key": "forestry",
"doc_count": 1,
"avg_age": {
"value": 35
}
},
{
"key": "sports",
"doc_count": 1,
"avg_age": {
"value": 25
}
}
]
}
~~~
在这个丰富的结果中,我们不但可以看到兴趣的统计数据,还能针对不同的兴趣来分析喜欢这个兴趣的`平均年龄`。
即使你现在还不能很好地理解语法,但是相信你还是能发现,用这个功能来实现如此复杂的统计工作是这样的简单。你的极限取决于你存入了什么样的数据哟!