聚合
Last updated
Was this helpful?
Last updated
Was this helpful?
聚合框架有助于在搜索查询时提供聚合数据。它基于称为聚合的简单构建块,可以进行组合以构建复杂的数据摘要。
聚合可以看作是在一组文档上建立分析信息的工作单元。执行的上下文定义此文档集是什么(例如,在已执行的query/filters的搜索请求的过滤器的上下文中执行顶级聚合)。
有许多不同类型的聚合,每种聚合都有自己的目的和输出。为了更好地理解这些类型,通常更容易将它们分为四个主要家族:
生成存储桶的一组聚合,其中每个存储桶都与一个键和一个文档条件相关联。执行聚合时,将对上下文中的每个文档评估所有存储桶条件,并且当条件匹配时,该文档将被视为“落入”相关存储桶。到聚合过程结束时,我们将得到一个存储桶列表-每个存储桶都有一组“属于”的文档。
聚集可跟踪和计算一组文档的指标。
一类聚合,可在多个字段上进行操作,并根据从请求的文档字段中提取的值生成矩阵结果。与指标和存储桶聚合不同,此聚合系列尚不支持脚本。
汇总其他汇总及其相关指标的输出的汇总
接下来是有趣的部分。由于每个存储桶有效地定义了一个文档集(所有属于该存储桶的文档),因此可以潜在地在存储桶级别关联聚合,并且这些聚合将在该存储桶的上下文中执行。这就是聚合真正的力量所在:聚合可以嵌套!
存储桶聚合可以具有子聚合(存储桶或指标)。子聚合将为其父聚合生成的存储桶进行计算。嵌套聚合的级别/深度没有硬性限制(可以将一个聚合嵌套在“父”聚合下,该父聚合本身是另一个更高级别聚合的子聚合)。
聚合作用于
double
数据的表示形式。因此,当在绝对值大于的多头上运行时,结果可能是近似的2^53
。
以下代码段捕获了聚合的基本结构:
JSON中的aggregations
对象(也可以使用aggs
)保存要计算的聚合。每个集合都与用户定义的逻辑名称相关联(例如,如果集合计算平均价格,则将其命名是有意义的avg_price
)。这些逻辑名称还将用于唯一地标识响应中的聚合。每个聚合都有特定的类型(在上面的代码段中的<aggregation_type>
),通常是命名聚合主体中的第一个键。每种聚合类型都定义自己的主体,具体取决于聚合的性质(例如,avg
特定字段上的汇总将定义将在其上计算平均值的字段)。在聚合类型定义的同一级别上,可以选择定义一组其他聚合,尽管仅当您定义的聚合具有存储特性时才有意义。在这种情况下,将为存储桶聚合构建的所有存储桶计算您在存储桶聚合级别上定义的子聚合。例如,如果您在聚合下定义一组range
聚合,则将为定义的范围存储区计算子聚合。
为聚合配置了field
和script
设置时,脚本将被视为 value script
。在文档级别评估普通脚本(即脚本可以访问与文档关联的所有数据)时,价值脚本在价值级别评估。在这种模式下,从配置中提取值,field
并script
使用值对这些值进行“转换”。
使用脚本时,还可以定义
lang
和params
设置。前者定义了所使用的脚本语言(假设默认情况下或作为插件,Elasticsearch中可以使用正确的语言)。后者允许将脚本中所有“动态”表达式定义为参数,从而使脚本在调用之间保持自身静态(这将确保在Elasticsearch中使用缓存的已编译脚本)。
Elasticsearch在映射中使用字段的类型,以弄清楚如何运行聚合并设置响应格式。但是,在两种情况下,Elasticsearch无法找出此信息:未映射的字段(例如,在多个索引之间的搜索请求中,只有其中一些具有该字段的映射)和纯脚本。在这种情况下,可以使用value_type
选项为Elasticsearch提供提示,该选项接受以下值:string
,long
(适用于所有整数类型), double
(适用于所有十进制类型,例如float
或scaled_float
)date
, ip
和boolean
。
一些汇总处理从汇总文档中提取的值。通常,聚合的值将会从被定义为field的指定的文档字段值中提取。也可以定义一个 将生成值的文档(每个文档)。