ES 十月 12, 2021

聚合查询

文章字数 2.8k 阅读约需 3 mins. 阅读次数 0

聚合查询

聚合(aggs)查询中,进行聚合的字段必须是exact value,分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(doc_values)变为了堆内存(field_data),大数据的聚合操作很容易导致OOM,详细原理会在进阶篇中阐述。

三种聚合分类

  1. 分桶聚合(Bucket agregations):类比SQL中的group by的作用,主要用于统计不同类型数据的数量

    函数:terms

    注意:聚合字段必须是exact value,如keyword

  2. 指标聚合(Metrics agregations):主要用于最大值、最小值、平均值、字段之和等指标的统计

    函数:平均值:Avg、最大值:Max、最小值:Min、求和:Sum、详细信息:Stats、数量:Value count

  3. 管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合,如要统计绑定数量最多的标签bucket,就是要先按照标签进行分桶,再在分桶的结果上计算最大值。

    函数:Min bucket:最小桶、Max bucket:最大桶、Avg bucket:桶平均值、Sum bucket:桶求和、Stats bucket:桶信息

语法

// 桶聚合或指标聚合
GET product/_search
{
  "aggs": {
    "<aggs_name>": {   //聚合函数的名称,自己定义
      "<agg_type>": {  // 聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)
        "field": "<field_name>" // 字段名称或者叫域名, 需要group by的字段.
      }
    }
  }
}

// 管道聚合
GET product/_search
{
  "size": 0,   //hit 记录条数. 聚合不需要显示具体详情.
  "aggs": {
    "my_aggs": {   //聚合的名称,自己定义
      "terms": {   // 桶聚合,聚合种类
        ...
      },
      "aggs": {                // 嵌套聚合,标签在 自定义聚合名称下.与聚合种类平级.
        "price_bucket": {    // 聚合的名称,自己定义.
          ...                // 聚合情况
        }
      }
    },
    "my_min_bucket":{        // 自定义管道聚合名称, aggs下,与需要的二级聚合的自定义名称标签同级.
      "min_bucket": {        // 管道聚合关键字.
        "buckets_path": "my_aggs>price_bucket"  // 管道聚合路径.从需要二级聚合的自定义标签位置,到需要聚合的自定义标签位置.中间用>连接
      }
    }
  }
}

更多聚合分类

  1. 嵌套聚合: 用于在某种聚合的计算结果之上再次聚合,如统计不同类型商品的平均价格,就是在按照商品类型桶聚合之后,在其结果之上计算平均价格

    // 嵌套聚合语法
    GET product/_search
    {
      "size": 0,
      "aggs": {
        "<agg_name>": {
          "<agg_type>": {
            "field": "<field_name>"
          },
          "aggs": {
            "<agg_name_child>": {
              "<agg_type>": {
                "field": "<field_name>"
              }
            }
          }
        }
      }
    }
    
  2. 基于query或filter的聚合

    // 语法
    GET product/_search
    {
      "query": {
        ...
      }, 
      "aggs": {
        ...
      }
    }
    
0%