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"
        }
      }
    }
}