Aggregations 聚合

聚合框架有助于基于搜索查询提供聚合数据。它基于称为聚合的简单构建块,可以组合以构建复杂的数据摘要。

聚合可以被视为在一组文档上构建分析信息的工作单元。执行的上下文定义了该文档集的内容(例如,在执行的查询的上下文中执行顶级聚合/搜索请求的过滤器)。

有许多不同类型的聚合,每个聚合都有自己的目的和输出。为了更好地理解这些类型,通常更容易将它们分为四个主要族:

Bucketing 桶

构建存储桶的一系列聚合,其中每个存储桶与密钥和文档标准相关联。执行聚合时,将在上下文中的每个文档上评估所有存储桶条件,并且当条件匹配时,文档被视为“落入”相关存储桶。在聚合过程结束时,我们最终会得到一个桶列表 - 每个桶都有一组“属于”它的文档。

Metric 指标

在一组文档中跟踪和计算指标的聚合。

Matrix 矩阵

一系列聚合,它们在多个字段上运行,并根据从请求的文档字段中提取的值生成矩阵结果。与度量标准和存储区聚合不同,此聚合系列尚不支持脚本。

Pipeline

聚合其他聚合的输出及其关联度量的聚合

接下来是有趣的部分。由于每个存储桶有效地定义了一个文档集(属于该存储桶的所有文档),因此可以在存储桶级别上关联聚合,并且这些聚合将在该存储桶的上下文中执行。这就是聚合的真正力量所在:聚合可以嵌套!

NOTE 分组聚合可以具有子聚合(分段或度量)。将为其父聚合生成的桶计算子聚合。嵌套聚合的级别/深度没有硬性限制(可以在“父”聚合下嵌套聚合,“父”聚合本身是另一个更高级聚合的子聚合)。

NOTE 聚合操作数据的双重表示。因此,当在绝对值大于2 ^ 53的long上运行时,结果可能是近似的。

Structuring Aggregationsedit 聚合结构

以下代码段捕获了聚合的基本结构:

  1. "aggregations" : {
  2. "<aggregation_name>" : {
  3. "<aggregation_type>" : {
  4. <aggregation_body>
  5. }
  6. [,"meta" : { [<meta_data_body>] } ]?
  7. [,"aggregations" : { [<sub_aggregation>]+ } ]?
  8. }
  9. [,"<aggregation_name_2>" : { ... } ]*
  10. }

JSON中的聚合对象(也可以使用密钥aggs)保存要计算的聚合。每个聚合与用户定义的逻辑名称相关联(例如,如果聚合计算平均价格,则将其命名为avg_price是有意义的)。

这些逻辑名称还将用于唯一标识响应中的聚合。每个聚合都有一个特定的类型(上面代码片段中的),通常是命名聚合体中的第一个键。每种类型的聚合定义其自己的主体,这取决于聚合的性质(例如,特定字段上的平均聚合将定义将在其上计算平均值的字段)。

在聚合类型定义的同一级别,可以选择定义一组其他聚合,但这只有在您定义的聚合具有分支性质时才有意义。

在此方案中,将针对由分组聚合构建的所有存储桶计算您在分段聚合级别上定义的子聚合。例如,如果在范围聚合下定义一组聚合,则将为定义的范围存储桶计算子聚合。

Values Source

某些聚合适用于从聚合文档中提取的值。通常,将从特定文档字段中提取值,该字段使用聚合的字段键进行设置。也可以定义一个脚本来生成值(每个文档)。

为聚合配置字段和脚本设置时,脚本将被视为值脚本。虽然在文档级别上评估普通脚本(即脚本可以访问与文档关联的所有数据),但是在值级别上评估值脚本。在此模式下,将从配置的字段中提取值,并使用脚本对这些值应用“转换”。

NOTE 使用脚本时,还可以定义lang和params设置。前者定义了所使用的脚本语言(假设Elasticsearch中有适当的语言,默认情况下或作为插件)。后者允许将脚本中的所有“动态”表达式定义为参数,这使脚本能够在调用之间保持静态(这将确保在Elasticsearch中使用缓存的编译脚本)。

Elasticsearch使用映射中字段的类型来确定如何运行聚合并格式化响应。但是有两种情况,Elasticsearch无法找出这些信息:未映射的字段(例如,跨多个索引的搜索请求,只有部分字段具有该字段的映射)和纯脚本。对于这些情况,可以使用value_type选项为Elasticsearch提供一个提示,该选项接受以下值:string,long(适用于所有整数类型),double(适用于所有小数类型,如float或scaled_float),date,ip和布尔值。