5.0. 聚合

聚合

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

聚合可以看作是在一组文档上建立分析信息的工作单元。执行的上下文定义此文档集是什么(例如,在已执行的搜索请求的查询/过滤器的上下文中执行顶级聚合)。

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

Bucketing

  • 生成存储桶的一组聚合,其中每个存储桶都与一个和一个文档条件相关联。执行聚合时,将对上下文中的每个文档评估所有存储桶条件,并且当条件匹配时,该文档将被视为“落入”相关存储桶。在汇总过程结束时,我们将获得一个存储桶列表-每个存储桶都带有一组“属于”的文档。

Metric

  • 用于跟踪和计算一组文档的指标的聚合。

Matrix

  • 一组聚合,可在多个字段上进行操作,并根据从请求的文档字段中提取的值生成矩阵结果。与指标和存储桶聚合不同,此聚合系列尚不支持脚本。

Pipeline

  • 聚合其他聚合的输出及其相关度量的聚合

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

注意 :存储桶聚合可以具有子聚合(存储桶或指标)。子聚合将为其父聚合生成的存储桶进行计算。嵌套聚合的级别/深度没有硬性限制(可以将一个聚合嵌套在“父”聚合下,该父聚合本身是另一个更高级别聚合的子聚合)。

注意:聚合对数据的双重表示起作用。因此当在绝对值大于2 ^ 53的长度上运行时,结果可能是近似的。

结构聚合

下面的代码片段描述了聚合的基本结构:

"aggregations" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

JSON 中的aggregations对象(也可以使用aggs)保存要计算的聚合。每个聚合都与用户定义的逻辑名称相关联(例如,如果聚合计算平均价格,则将其命名为avg_price 是有意义的)。这些逻辑名称还将用于唯一地标识响应中的聚合。每个聚合都具有特定的类型(上面的代码片段中为<aggregation_type>),通常是命名聚合主体中的第一个键。每种聚合类型都取决于聚合的性质(例如,特定字段上的 avg 聚合将定义要在其上计算平均值的字段),定义自己的主体。在聚合类型定义的同一级别上,可以选择定义一组其他聚合,尽管仅当您定义的聚合具有存储特性时才有意义。在这种情况下,将为存储桶聚合构建的所有存储桶计算您在存储桶聚合级别上定义的子聚合。例如,如果您在 range 聚合下定义一组聚合,则将为定义的范围存储桶计算子聚合。

聚合值的来源

某些聚合对从聚合文档中提取的值起作用。通常这些值将从特定的文档字段中提取,该字段是使用聚合的field键设置的。它也可以定义一个script去生成值(每个文档)。

如果为聚合配置了valuescript设置,则该脚本将被视为value script。虽然普通脚本是在文档级别评估的(即脚本可以访问与文档关联的所有数据),但值脚本是在级别评估的。在这种模式下,将从配置的field中提取值,并使用script对这些值进行"转换''。

注意:当使用脚本时,可以定义langparmas 设置,前者定义了所使用的脚本语言(假设在 Elasticsearch 中有合适的语言,可以是默认的,也可以是插件)。后者支持将脚本中的所有“动态”表达式定义为参数,这使脚本能够在调用之间保持自身的静态(这将确保在 Elasticsearch 中使用缓存的编译脚本)。

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

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~