ES的高级功能聚合Aggregations功能为ES注入了统计分析的血统,使在面对大数据提取统计指标时变的游刃有余。aggregation的部分特性类似于SQL语言中的group by,avg,sum等函数。但同时还提供了更复杂的统计分析接口。agg中有俩个主要的概念.
- 桶(Buckets):符合条件的文档的集合,相当于SQL中的group by。比如,在users表中,按“地区”聚合,一个人将被分到北京桶或上海桶或其他桶里;按“性别”聚合,一个人将被分到男桶或女桶
- 指标(Metrics):基于Buckets的基础上进行统计分析,相当于SQL中的count,avg,sum等。比如,按“地区”聚合,计算每个地区的人数,平均年龄等
默认情况下,聚合查询是在aggs字段中进行设置。
max/min/avg/sum/stats(包括前面几项)
## 查询price字段之和
GET /books/_search
{
"size": 0,//size=0 表示不需要返回参与查询的文档。
"aggs": {
"price_count": { // price_count为返回字段的名称设置
"sum": {
"field": "price"
}
}
}
}
# 查询price字段的统计情况 最大值最小值平均和
GET /books/_search
{
"size": 0,
"aggs": {
"price_stats": {
"stats": {
"field": "price"
}
}
}
}
//返回
{
"took" : 13,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"price_stats" : {
"count" : 2,
"min" : 100.0,
"max" : 139.0,
"avg" : 119.5,
"sum" : 239.0
}
}
}
percentiles 求百分比
percentiles对指定字段(脚本)的值按从小到大累计每个值对应的文档数的占比(占所有命中文档数的百分比),返回指定占比比例对应的值。默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值
GET /books/_search
{
"size": 0,
"aggs": {
"percenlis_stats": {
"percentiles": {
"field": "price"
}
}
}
}
文档数量统计
GET /books/_search
{
"size": 0,
"aggs": {
"doc_count": {
"value_count": {
"field": "price"
}
}
}
}
Terms聚合
# 根据价格统计各个价格的书籍有几条记录 注意这种方式只能统计大概,并不能准确的统计
GET /books/_search
{
"size": 0,
"aggs": {
"genders": {
"terms": {
"field": "price"
}
}
}
}