聚合

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

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

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

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

度量聚合 在一组文档中跟踪和计算度量的聚合。

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

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

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

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

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

构建聚合

以下代码为聚合的基本结构:

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

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

值来源

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

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

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

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

results matching ""

    No results matching ""