ElasticSearch学习笔记之二十 聚合
聚合
聚合的核心在于基于搜索查询的聚合数据。它是基于简单的称为聚合构建块,它可以组合,以便构建复杂的数据总结。
聚合通常可以视作一组在一系列文档上执行信息分析的工作单元,执行的上下文定义该文档集是什么(例如,顶级聚合在搜索请求的执行的查询/过滤器的上下文中执行)。
聚合可以分为很多种,每一种都有其自己的目标和输出,为了更高的理解它们,我们一般将它们分为四类:
类型 | 说明 |
---|---|
Bucketing (桶聚合) | 创建多个分组,每个分组都关联一个关键字和相关文档标准, 当执行聚合的时候,所有分组都会根据自身标准评估每一个符合的文档,当文档匹配分组的时候,会将文档划分近相关的分组里。 聚合完成时,会给出一个分组列表,每一个分组都会有一组"属于"它的文档。 |
Metric(指标) | 对一组文档进行统计和指标计算 |
Matrix | 这类聚合对对多个字段进行操作并基于查询的的文档字段中提取的值产生矩阵结果。不像metric 和 bucket 聚合,Matrix它不支持脚本。 |
Pipeline | 这类聚合的数据源是其他聚合的输出和它们的Metric计算指标 |
简单概念说明:
概念 | 说明 |
---|---|
桶(Buckets) | 满足特定条件的文档的集合 |
指标(Metrics) | 对桶内的文档进行统计计算 |
有趣的是,由于每个桶有效地定义了一个文档集(属于桶的所有文档),因此可以潜在地关联桶级别上的聚合,并且这些聚合将在该桶的上下文中执行。这就是聚合的真正力量所在:聚合可以嵌套!
Bucketing聚合可以有子聚合(bucketing 或者 metric),子聚合将计算由副聚合生成分组。对于嵌套聚合的水平和深度没有硬性要求(可以在一个父聚合下嵌套一个或者多个子聚合)。
聚合的基本结构
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
在JSON请求体中我们使用 aggregations
关键字来做聚合操作(也可以简写为aggs
)。 每一个聚合关联一个用户定义的逻辑名称 (例如. 如果要聚合计算平均价格price, 可以命名为avg_price
). 这些逻辑名称将会在返回体返回聚合的相应结果。每一个聚合有一个特定的聚合类型 (即上面案例中的<aggregation_type>
) 并且通常作为聚合操作请求体的第一个关键字. 每一种类型的聚合会根据聚合的性质定义参数(例如. avg 聚合 将在字段上面进行平均值的计算). 当定义了同一级别的聚合并且类型是分组聚合的时候,可以额外定义聚合。 在这种情况下,在分组聚合级别上定义的子聚合会计算所有的分组聚合执行产生的分组,例如, 如果在范围聚合下定义一组子聚合 子聚合会计算所有范围聚合产生的分组。
Values Source
一些聚合针对参与聚合的文档中提取出来的值进行计算,通常情况下 ,这些值是从文档的特定字段中取出来的,同样也可以编写 script来手机分一个文档的值。
当一个聚合里面同时包含文档字段和script
时,script
会被当作值script. 同时普通scripts
会在文档级别计算值(即 script需要访问所有于文档相关联的数据),值 scripts 在值的级别上进行计算,在这种情况下, 值将从配置的字段中提取 并且 script 被用来对这些值进行"转换"。
注意:
当使用scripts的时候, 依然可以配置 lang 和 params。前者定义的是使用的脚本语言 (假设适宜的语言在Elasticsearch可用, 无论是默认语言还是插件). 后者可以把script
中 “动态的” 表达式定义为参数, 这样就可以确保script
在调用过程中不变 (这也是缓存编译的script在Elasticsearch可用).
Elasticsearch 使用我们在映射中对字段类型的定义来定位如何聚合以及格式化返回的信息。但是还是存在2中情况Elasticsearch 不能搞清楚这些信息:
- 没有映射的字段(例如多索引查询中,只有一个由映射的字段)。
- 纯
scripts
在这些情况下 Elasticsearch 可以利用 value_type
参数, 它可以接受以下参数: string, long
(同理所有的integer
), double
(同理所有的浮点数例如 floa
或 scaled_float
), date, ip and boolean
.