ES 聚合API

Elasticsearch 提供聚合 API,用于数据的聚合。聚合框架提供基于搜索查询的聚合数据。简而言之,聚合框架收集由搜索查询选择并提供给用户的所有数据。它包含几个构建块,可帮助构建复杂的数据摘要。聚合会生成 Elasticsearch 中可用的分析信息。

以下是一些需要注意的聚合要点:

  • 聚合可以组合在一起以构建复杂的数据摘要。
  • 它可以被视为一个工作单元,它通过一组在 elasticsearch 中可用的文档生成分析信息。
  • 它基本上基于构建块。
  • 聚合函数与 SQL AVERAGE 和 GROUP BY COUNT 函数相同。
  • 在 elasticsearch 中使用聚合时,我们可以对任何数字字段执行 GROUP BY 聚合,但我们必须输入 keyword(关键字就像索引)或 fielddata = true 用于文本字段。

看下图,聚合的样子:

Elasticsearch Aggregation APIs

聚合语法

聚合的基本结构:

"aggregation" : {
    "<aggregation_name1>" : {
         "<aggregation_type>" : {
                  <aggregation_body>
              "field " : "document_field_name" 
}
[ , "meta" : { [<meta_data_body>] } ]?
[ , "aggregation" : { [<sub_aggregation>] + } ]?
     }
     [ , "<aggregation_name_2>"  : { . . . } ]*
}

我们可以一次使用多个聚合。

聚合-是JSON 保存要计算的聚合。您还可以使用 aggs 关键字代替聚合。

aggregation_name- 每个聚合都有一个由用户定义的逻辑名称。例如,使用 avg_price 计算平均价格。

aggregation_type- 这是一种聚合类型,因为每个聚合都有一个特定的名称。

Aggregation_body- 每种聚合类型都由自己的聚合主体组成,这取决于聚合的性质。

field- 是字段关键字。

document_field_name- 它是文档中目标列的名称。

聚合类型

在 Elasticsearch 中,有几种类型的聚合可用,其中每个聚合都有自己的目的和输出。为简化起见,将它们归纳为4大族,分别如下:

  • 指标聚合
  • 分桶聚合
  • 矩阵聚合
  • 管道聚合

指标聚合

指标聚合是一种聚合,负责对指标进行持续跟踪。度量聚合根据聚合文档的字段值计算矩阵。它还有助于计算一组文档的度量。

一些聚合生成数字度量,它们是:

  • 单值数值度量聚合,即平均聚合或
  • 多值数值指标聚合,即统计数据

Bucketing

Bucketing 是一个聚合家族,负责构建桶。它不计算指标聚合等字段的指标。在这个聚合中,每个桶都与一个键和一个文档相关联。桶聚合用于分组或创建数据桶。这些数据桶可以基于现有的字段、范围和自定义过滤器等进行制作。

矩阵聚合

Metrix 聚合是一种对多个对象进行操作的聚合领域。它适用于多个字段,并从值中生成一个矩阵结果,该结果是从请求文档字段中提取的。 Matrix 不支持脚本。

Pipeline

顾名思义,它从其他聚合的输出中获取输入。换句话说,我们可以说,-管道聚合负责聚合其他聚合的输出。

所有这些聚合都被进一步分类,特别是桶、管道和指标聚合。

五个重要的聚合

下面举例说明elasticsearch的一些基本聚合。

  • 平均聚合
  • 术语聚合
  • 基数聚合
  • 统计聚合v

平均聚合

平均聚合用于计算索引中任何数字字段的平均值。创建查询时在查询中指定聚合名称 avg。查看以下示例以查找字段 "fees" 的平均值:

Copy Code

POST student1/ _search/
{
  "aggs": {  
       "avg_fees": {
               "avg" : { 
                    "field": "fees"
                }
          }
    }
}

通过执行上面的代码,我们将得到文档中存在的费用的平均值。

响应:

你将得到如下输出以下回复。

{ 
"took": 1251,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
                   "total": {
 "value": 3,
 "relation": "eq"
          },
"max_score": 1,
"hits": [
   {
         "index": "student1",
         "type": "_doc",
         "id": "01",
         "score": 1,
         "_source": {
 "name ": "Denial Parygen",
 "dob": "07/Aug/1998",
 "course": "Mass Communication",
 "Addmission year": "2018",
 "email": "denial@gmail.com",
 "street": "3511 Rodney Street", 
 "state": "Missouri", 
 "country": "United States", 
 "zip": "62208",
 "fees": "24800"
   }
            },
 {
         "index": "student1",
         "type": "_doc",
         "id": "03",
         "score": 1,
         "_source": {
 "name ": "Bob Hana",
 "dob": "13/Sep/1998",
 "course": "BFA",
 "Addmission year": "2019",
 "email": "bob@gmail.com",
 "street": "724 Monroe Street", 
 "state": "Hauston", 
 "country": "United States", 
 "zip": "77063",
 "fees": "18900"
   }
           },
{
         "index": "student1",
         "type": "_doc",
         "id": "02",
         "score": 1,
         "_source": {
 "name ": "Jass Fernandiz",
 "dob": "07/Aug/1996",
 "course": "Bcom (H)",
 "Addmission year": "2019",
 "email": "jassf@gmail.com",
 "street": "4225 Ersel Street", 
 "state": "Texas", 
 "country": "United States", 
 "zip": "76011",
 "fees": "22900"
   }
           }
       ]
   },
   "aggregations": {
           "avg_fees": {
                  "value": "22200"
         }
     }
}

如果该字段缺失

如果该字段在文档中不存在(您正在计算平均值),默认情况下它会被忽略并为空值被返回。您可以在聚合中添加缺失字段("missing": 0) 以将缺失值视为默认值。执行以下代码:

POST new_student/ _search/
{
    "aggs": {  
       "avr_fees": {
               "avg" : { 
                    "field": "fees",
                    "missing": 0
                }
          }
    }
}

Terms Aggregation

terms 聚合负责按字段值生成桶。通过选择一个字段(如姓名、入学年份等),它会生成桶。创建查询时指定查询中的聚合名称。

执行以下代码以搜索按入学年份字段分组的值:

复制代码

POST student/ _search/
{
   "size": 0,  
    "aggs": {  
       "group_by_Addmission year": {
               "terms" : { 
                    "field": "Addmission year.keyword"
                }
          }
    }
}

通过执行上面的代码,输出将按入学年份作为一个组返回。

响应:

您将得到类似的输出以下回复。

{ 
"took": 179,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
                   "total": {
 "value": 3,
 "relation": "eq"
          },
"max_score": null,
"hits": [ ]
},
  "aggregations":  {
         "group_by_Addmission year": {
             "student1",
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
              "buckets": [
              {
      "key ": "2019",
      "doc_count": 2 
 },
 {
      "key": "2018",
      "doc_count": 1
}
                  ]
          }
     }
}

上面的查询和响应在elasticsearch-head插件中看起来像下面的截图:

Elasticsearch Aggregation APIs

Cardinality Aggregation

为一个字段找到一个唯一值是一个常见的要求。基数聚合有助于为任何特定字段找到唯一值。它有助于确定索引中存在的唯一元素的数量。

在创建查询时指定查询中的聚合名称。执行以下代码以查找字段的唯一值数量:

POST student/ _search/
{
   "size": 0,  
    "aggs": {  
       "unique_fees": {
               "cardinality" : { 
                    "field": "fees"
                }
          }
    }
}

通过执行上述代码,输出将返回 fees 字段的唯一值总数 student 索引。

响应:

您将得到如下响应的输出。

{ 
"took": 85,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
                   "total": {
 "value": 3,
 "relation": "eq"
          },
"max_score": null,
"hits": [ ]
},
  "total":  {
              "value": 3,
              "relation": "eq":             
       }
       "max_score ": null
        "hits": [ ]
},
"aggregations": {
      "unique_fees": {
      "value": 3
}
                  ]
          }
     }
}

看下面的截图,查询如何在elasticsearch head插件中运行并响应:

Elasticsearch Aggregation APIs

Stats Aggregation

Stats Aggregation 代表statistics,是一种多值的数值矩阵聚合。它有助于在一次拍摄中生成 sum、avg、min、max 和 count。当聚合文档很大时,此聚合允许生成特定数字字段的所有统计信息。查询结构与其他聚合相同。

执行以下代码,单次查找sum、avg、min、max和count:

复制代码

POST student/ _search/
{
       "aggs": {  
       "stats_fees": {
               "extended_stats" : { 
                    "field": "fees"
                }
          }
    }
}

响应:

通过执行上面的代码,你会得到如下响应的输出。

{ 
"took": 75,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
                   "total": {
 "value": 3,
 "relation": "eq"
          },
"max_score": null,
"hits": [ ]
},
"aggregation": {
    "stats_fees": {
            "count": 3,
"min": 18900,
"max": 24800,
"avg": 22200,
"sum": 66600,
"sum_of_square": 1496660000,
"variance": 9070000,
"std_deviation": 3011.644,
"std_deviation_bounds": {
       "upper": 2600,
       "lower": 700
                  }
          }
     }
}

过滤聚合

过滤聚合有助于过滤单个桶中的文档。它的主要目的是通过过滤文档向其用户提供最佳结果。我们举个例子,根据"费用"和"入学年份"过滤文档。这将返回与查询中指定的条件匹配的文档。您可以使用任何您想要的字段来过滤文档。

执行以下代码以过滤与您在查询中指定的条件匹配的文档:

复制代码

POST student/ _search/
{
       "query": {  
            "bool": {
                "filter": [
                     { "term": { "fees": "22900" } },
                     { "term": { "Addmission year": "2019" } },
                ]
          }
    }
}

响应

通过执行上面的代码,你会得到如下响应的输出。

{ 
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
                   "total": {
 "value": 1,
 "relation": "eq"
          },
"max_score": 0,
"hits": [ ]
{
          "index": "student",
         "type": "_doc",
         "id": "02",
         "score": 1,
         "_source": {
 "name ": "Jass Fernandiz",
 "dob": "07/Aug/1996",
 "course": "Bcom (H)",
 "Addmission year": "2019",
 "email": "jassf@gmail.com",
 "street": "4225 Ersel Street", 
 "state": "Texas", 
 "country": "United States", 
 "zip": "76011",
 "fees": "22900"
                  }
             }
         ]
     }
}

上面的查询和响应在elasticsearch head插件中看起来像下面的截图-

Elasticsearch Aggregation APIs

下一章:ES 索引API

Elasticsearch 提供了 Index API 来管理索引的所有方面,例如索引模板、映射、别名和设置等。在 Elasticsearch,Index API 执行索引级别的操作。它负责管理不同的索引、索引设置、索引模 ...