Elasticsearch聚合功能(aggregations)使你能够获取有关搜索结果的元信息,并回答像“德克萨斯州有多少个帐户持有人?”、“田纳西州的平均帐户余额是多少?”之类的问题。你可以在一个请求中搜索、过滤文档,并使用聚合功能分析结果。
例如,以下请求使用terms
聚合功能(Simon:即按照某个字段名来聚合,类似MySQL中的group by <colunmName>)将bank
索引中的所有帐户按州名分组,并降序返回帐户数量最多的十个州:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}
返回结果中的buckets
字段是state
字段相关的值。 doc_count
显示了每个state
对应的帐户数。 例如,你可以看到ID(爱达荷州)有27个帐户。 因为请求中设置了size=0
,所以响应仅包含聚合结果。
{
"took": 29,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped" : 0,
"failed": 0
},
"hits" : {
"total" : {
"value": 1000,
"relation": "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound": 20,
"sum_other_doc_count": 770,
"buckets" : [ {
"key" : "ID",
"doc_count" : 27
}, {
"key" : "TX",
"doc_count" : 27
}, {
"key" : "AL",
"doc_count" : 25
}, {
"key" : "MD",
"doc_count" : 25
}, {
"key" : "TN",
"doc_count" : 23
}, {
"key" : "MA",
"doc_count" : 21
}, {
"key" : "NC",
"doc_count" : 21
}, {
"key" : "ND",
"doc_count" : 21
}, {
"key" : "ME",
"doc_count" : 20
}, {
"key" : "MO",
"doc_count" : 20
} ]
}
}
}
你可以组合聚合语句来构建更复杂的数据汇总查询。 例如,以下请求将avg
聚合嵌套在先前的group_by_state
聚合内,以计算每个州的平均帐户余额。
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
除了按计数结果进行排序,你还可以在terms
聚合查询中指定子嵌套聚合查询的结果进行排序:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
除了这些基本的聚合功能外,Elasticsearch还提供了定制化的聚合,用于在多个字段上操作并分析特定类型的数据,例如日期,IP地址和地理数据。 你还可以将单个聚合的结果传送到管道聚合中,以进行进一步分析。
聚合提供的核心分析可提供一些高级功能,例如使用机器学习来检测异常。