ES3_5聚合查询

聚合查询

聚合 - aggs

Sorting, aggregations, and accessing field values in scripts 需要使用到一个称为 fielddata(正排索引)的数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
PUT megacorp/_mapping/employee/
{
"properties": {
"interests": {
"type": "text",
"fielddata": true
}
}
}
GET /megacorp/employee/_search
{
"aggs" : { // 和query同级的关键词
"all_interests" : { // 自定义聚合名字
"terms" : { // 聚合的定义:不同的type+body
"field" : "interests"
},
"aggs" : { // 子聚合查询
"avg_age" : {
"avg" : { "field" : "age" }
}
}
},
"max_salary": { // 可以包含多个同级的聚合查询
"max": { // 求salary字段的最大值
"field": "salary"
}
}
}
}

聚合作用范围

  • ES聚合分析的默认作用范围是query的查询结果集
  • ES还支持以下方式改变聚合的作用范围
    Filter
    Post Filter
    Global

简单聚合

单值分析(只输出一个分析结果):

  • min, max, avg, sum
  • Cardinality (类似 distinct count)

多值分析(输出多个分析结果):

  • stats, extended stats
  • percentile, percentile rank
  • top hits

Bucket

按照一定的规则,将文档分配到不同的桶中,从而达到分类的目的。
Bucket同样支持嵌套。

常用的Bucket Aggregation函数:

  • terms
    按某个字段聚合,结果默认会进行分词
    需要字段打开fielddata才能进行term aggregation
    keyword默认支持doc_values
    text需要在mapping中enable fielddata
  • 数字类型
    • Range
    • Histogram
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      POST employees/_search
      {
      "size": 0,
      "aggs": {
      "jobs": {
      "terms": {
      "field": "job"
      }
      }
      }
      }

Pipeline

对聚合分析结果再进行一次聚合分析
Pipeline的分析结果会输出到原结果中,根据位置的不同,分为两类:

  • Sibing:结果和现有分析结果同级
    max, min, avg, sum bucket
    stats, extended status bucket
    percentiles bucket
  • Parent:结果内嵌到现有的聚合分析结果之中
    Derivative(求导)
    Cumultive Sum(累计求和)
    Moving Function(滑动窗口)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field": "job.keyword",
"size": 10
},
"aggs": {
"avg_salary": {
"avg": {
"field": "salary"
}
}
}
},
"min_salary_by_job": {
"min_bucket": { // min_bucket求之前结果的最小值
"buckets_path": "jobs>avg_salary" // buckets_path关键字指定路径
}
}
}
}