Elastic Search 聚合笔记

ElasticSearch的聚合(Aggregations)引入了两个概念: html

  1. 桶(Buckets):    知足特定条件的文档的集合
  2. 指标(Metrics):    对桶内的文档进行统计计算

每一个聚合都是多个桶指标的组合。和sql的聚合语法对比: 算法

SELECT COUNT(color) FROM table_xxx GROUP BY color  sql

在概念上相似于 SQL 的分组(GROUP BY),而指标则相似于 COUNT() 、 SUM() 、 MAX() 等统计方法。 数据库

典型示例: 数组

一个ES聚合的请求示例以下: elasticsearch

{
    "size"0,
    "aggs": {
      "
最大费用": {
        "max": { "field""
费用" }
    }
  }
}
ide

关键字"aggs"标志了它是一个聚合请求,里面的请求参数为: sqlserver

"最大费用": { "max""field""费用" } } ui

主要包含标题,聚合类型(关键字),聚合参数三个部分。 spa

返回值为:

{
    "aggregations": {
      "
最大费用": {
        "value"2260.0
      }
    }
}

返回值随着不一样的请求值会呈现不一样的格式,具体规则能够看下面介绍。

 

指标(Metrics):

指标用来对查询结果进行统计运算,除了计数外,大部分针对数字类型属性进行统计。

"aggs": {
    "
最大费用": { "max": { "field""费用" } }
}

典型的统计算法有:

  • 计数
  • 最大值
  • 最小值
  • 平均值

ES也支持一些高级统计指标,例如加权平均值,范围百分比等,具体可参看其官方文档

一个聚合请求下能够下发多个指标:

{
    "size"0,
    "aggs": {
      "
最大费用": { "max": { "field""费用" } },
      "
费用合计": { "sum": { "field""费用" } }
    }
}

 

桶(Buckets):

桶用于对数据进行分组,相似于sqlserver的group,传统的分组请求在es中对应的语法为:

"aggs": {
    "
性别": {
      "terms": { "field""
性别" }
    }
}

和传统的关系型数据库分组相比,ES具备以下优点:

  1. 提供很多高级分组方式,如直方图,范围,过滤等
  2. 支持多级聚合,很是容易构建相似透视图的数据。
  3. 支持多种管道聚合

聚合和bucket的层级关系:

  1. 聚合能够放多个bucket,
  2. bucket下也能够挂聚合

这样,当使用两个指标分组的时候,有两种组合方式,

  1. 一个聚合,两个指标
  2. 两个指标组合成一个多级聚合

这两个的行为是不同的,当聚合下放多个bucket的时候,是从两个维度分别统计,并union展现:后面的则是在第一个指标每一个分组中就行二次分组。

简单的讲,一个是a+b, 一个是a*b

 

返回结果格式:

规则1: 当只返回一个结果的时候,会做为属性返回,metrics的返回值基本上遵循此规则。

查询

 "aggs": {
    "
最大费用": { "max": { "field""费用" } },
    "
费用合计": { "sum": { "field""费用" } }
}

返回结果:

"aggregations": {
    "
最大费用": { "value"2260.0 },
    "
费用合计": { "value"158704.37085723877 }
}

有的bucket也只返回一个结果,例如filter bucket

规则2: 结果分组名称不可预知的时候,会做为名为buckets的数组返回,大部分的bucket返回结果知足此属性。

请求:

"aggs": {
    "
性别": { "terms": { "field""性别" }
  }
}

返回结果:

"aggregations": {
    "
性别": {
      "doc_count_error_upper_bound"0,
      "sum_other_doc_count"0,
      "buckets": [
        { "key""
""doc_count"289 },
        { "key""
""doc_count"208 }
    ]
  }
}

规则3: 结果分组是可预知的多值是,会做为名为buckets的对象返回,部分bucket返回值,如rangefilters遵循此规则。

请求:

"aggs": {
    "
费用级别": { 
      "range": {
        "field""
费用",
        "keyed"true,
        "ranges": [
          { "key""
便宜""to"100 },
          { "key""
通常""from"100"to"300 },
          { "key""
""from"300 }
        ]
      }
    }
}

返回结果:

"aggregations": {
    "
费用级别": {
      "buckets": {
        "
便宜": { "to"100.0"doc_count"20 },
        "
通常": { "from"100.0"to"300.0"doc_count"385 },
        "
": { "from"300.0"doc_count"92}      }   }}