最后,我们要完成最后一个业务需求:允许管理者对员工信息做出数据分析。ES有个功能叫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
}
]
}
}
}
结果显示两个员工对music有兴趣,一个对forestry感兴趣,一个对sport感兴趣。这个aggregations并不是预先计算好的,结果是在查找符合条件的文档的时候生成的。如果,还想统计叫Smith的人的兴趣,还可以如下进行组合查询。
GET /megacorp/employee/_search
{
"query":{
"match":{
"last_name":"smith"
}
},
"aggs":{
"all_interests":{
"terms":{
"field":"interests"
}
}
}
}
all_interests节点下就仅仅包含符合查询Smith的条件的员工兴趣信息
...
"all_interests":{
"buckets":[
{
"key":"music",
"doc_count":2
},
{
"key":"sports",
"doc_count":1
}
]
}
Aggregations允许嵌套查询。例如,查询对某个爱好感兴趣的员工的平均年龄,
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
}
}
]
}
输出的结果相对于开始运行的aggregation变得更为丰富。现在不但有了兴趣的列表和他们的数量,并且还对每一个兴趣计算出了对这个兴趣感兴趣的员工的平均年龄。
即使你不了解语法,你也能很容易的看到非常复杂的aggregation和group都能使用这个特色来搞定,查询什么样的数据是没有限制的。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_analytics.html
时间: 2024-10-14 19:39:29