聚合框架帮助提供基于搜索查询的聚合数据,它基于称为聚合的简单构建块,能够进行组合以构建复杂的数据摘要。缓存
聚合能够看做是在一组文档上构建分析信息的工做单元,执行的上下文定义了这个文档集是什么(例如,顶级聚合在搜索请求的已执行的查询/过滤器的上下文中执行)。框架
有许多不一样类型的聚合,每一个聚合都有本身的目的和输出,为了更好地理解这些类型,一般更容易将它们分为四个主要类别:插件
接下来是有趣的部分,因为每一个桶都有效地定义了一个文档集(属于桶的全部文档),所以能够在桶级别上关联聚合,这些聚合将在桶上下文中执行,这就是聚合的真正威力所在:聚合能够嵌套!code
桶聚合能够有子聚合(桶或指标),子聚合将被用于它们的父聚合生成的桶的计算,嵌套聚合的级别/深度没有硬性限制(能够将聚合嵌套在“父”聚合下,后者自己是另外一个更高级别聚合的子聚合)。
聚合在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
来生成值(每一个文档)。ip
在为聚合配置field
和script
设置时,脚本将被视为value script
,普通脚本在文档级别进行评估(即脚本能够访问与文档相关的全部数据),而值脚本在值级别进行评估,在这种模式下,从配置的field
和script
中提取的值被用于在这些值上应用“转换”。文档
在使用脚本时,还能够定义lang
和params
设置,前者定义了使用的脚本语言(假设适当的语言在Elasticsearch中可用,默认状况下或做为插件使用),后者支持将脚本中的全部“动态”表达式定义为参数,从而使脚本在调用之间保持自身的静态(这将确保在Elasticsearch中使用缓存的已编译脚本)。
Elasticsearch使用映射中的字段类型来计算如何运行聚合并格式化响应,然而,在两种状况下,Elasticsearch没法计算出这些信息:未映射字段(例如在跨多个索引的搜索请求中,其中只有一些具备字段映射)和纯脚本。对于这些状况,可使用value_type
选项给Elasticsearch一个提示,它接受如下值:string
、long
(适用于全部整数类型)、double
(适用于全部小数类型,如float
或scaled_float
)、date
、ip
和boolean
。string