聚合介绍
聚合框架帮助提供基于搜索查询的聚合数据,它基于称为聚合的简单构建块,可以进行组合以构建复杂的数据摘要。
聚合可以看作是在一组文档上构建分析信息的工作单元,执行的上下文定义了这个文档集是什么(例如,顶级聚合在搜索请求的已执行的查询/过滤器的上下文中执行)。
有许多不同类型的聚合,每个聚合都有自己的目的和输出,为了更好地理解这些类型,通常更容易将它们分为四个主要类别:
桶
- 构建桶的聚合系列,其中每个桶与键和文档标准相关联,在执行聚合时,将对上下文中每个文档评估所有桶标准,当一个标准匹配时,文档被认为是“落入”相关的桶中,在聚合过程结束时,我们将得到一个桶列表 — 每个桶都有一组“属于”它的文档。
指标
- 对一组文档进行跟踪和计算指标的聚合。
矩阵
- 基于从请求的文档字段中提取的值在多个字段上操作并生成矩阵结果的聚合系列,与指标和桶聚合不同,此聚合系列还不支持脚本。
管道
- 聚合其他聚合的输出及其相关指标的聚合。
接下来是有趣的部分,由于每个桶都有效地定义了一个文档集(属于桶的所有文档),因此可以在桶级别上关联聚合,这些聚合将在桶上下文中执行,这就是聚合的真正威力所在:聚合可以嵌套!
桶聚合可以有子聚合(桶或指标),子聚合将被用于它们的父聚合生成的桶的计算,嵌套聚合的级别/深度没有硬性限制(可以将聚合嵌套在“父”聚合下,后者本身是另一个更高级别聚合的子聚合)。
聚合在double
表示的数据上操作,因此,当在绝对值大于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>
),通常是命名聚合body中的第一个键。每种聚合类型都定义了自己的body,具体取决于聚合的性质(例如,特定字段上的avg
聚合将定义计算平均值的字段)。在聚合类型定义的同一级别上,可以选择定义一组额外的聚合,但只有在你定义的聚合具有桶的性质时,这才有意义。在这个场景中,你在桶聚合级别上定义的子聚合将用于计算由桶聚合构建的所有桶,例如,如果你在range
聚合下定义了一组聚合,那么子聚合将用于你定义的范围桶计算。
值来源
一些聚合处理从聚合文档中提取的值,通常,值将从使用聚合的field
键设置的特定文档字段中提取,还可以定义一个script
来生成值(每个文档)。
在为聚合配置field
和script
设置时,脚本将被视为value script
,普通脚本在文档级别进行评估(即脚本可以访问与文档相关的所有数据),而值脚本在值级别进行评估,在这种模式下,从配置的field
和script
中提取的值被用于在这些值上应用“转换”。
在使用脚本时,还可以定义lang
和params
设置,前者定义了使用的脚本语言(假设适当的语言在Elasticsearch中可用,默认情况下或作为插件使用),后者支持将脚本中的所有“动态”表达式定义为参数,从而使脚本在调用之间保持自身的静态(这将确保在Elasticsearch中使用缓存的已编译脚本)。
Elasticsearch使用映射中的字段类型来计算如何运行聚合并格式化响应,然而,在两种情况下,Elasticsearch无法计算出这些信息:未映射字段(例如在跨多个索引的搜索请求中,其中只有一些具有字段映射)和纯脚本。对于这些情况,可以使用value_type
选项给Elasticsearch一个提示,它接受以下值:string
、long
(适用于所有整数类型)、double
(适用于所有小数类型,如float
或scaled_float
)、date
、ip
和boolean
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。