聚合
在使用查询query的时候,可以使用 aggregations 框架来聚合数据。只需要在query语句构建的时候使用aggregations块。
一个aggregation可以被视作一个在doc集合的基础上做分析的单元。它执行上下文信息定义了这个集合。比如说search请求的query/filters的上下文,会被用来执行顶层的聚合。
有许多不同类型的aggregations,他们可以实现不同的需求,并且有不相同的输出。可以将这些聚类分为4个大家族
bucketing : 桶
这个系列的聚合,可以构建桶,每个桶关联一个key和一个criterion。 当执行聚合时,根据标准来评估,在上下文中的文档集合中的每个文档,并且当匹配这个标准时,该文档被认为“落入”相关桶。 在聚合过程结束时,我们将最终得到一个桶列表,每个桶都有一组“属于”这个桶的文档。Metric : 指标
基于一个doc集合跟踪和计算指标。Matrix:矩阵
操作多个字段,并且基于从requested文档字段中抽取的值,产生一个矩阵。这种类型的聚合不支持脚本。Pipeline:管道
聚合其他聚合的输出或者相关的指标。
由于每个桶有效地定义了一个文档集(所有文档属于存储桶),所以可以潜在地关联存储桶级别的聚合,并且它们将在该存储桶的上下文中执行。 这是聚合的真正力量在哪里:聚合可以嵌套!
bucket 聚合可以包含子聚合(bucket 或 metric)。 子聚合将根据父聚合生成的bucket进行计算。 嵌套聚合的级别/深度没有硬限制(可以在“父”聚合下嵌套聚合,本身就是另一个更高层聚合的子聚合)。
聚合的结构
下面的片段是聚合的基本结构:
"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里的第一个key。每种类型的聚合根据聚合的性质来定义了其自己的body(例如,特定字段上的平均聚合将定义将计算平均值的字段)。在聚合类型定义的相同级别,可以选择定义一组附加聚合,尽管如果您定义的聚合具有压力性质,这仅仅是有意义的。在这种情况下,您将在针对集合聚合级别定义的子聚合计算所有由聚合聚合构建的桶。例如,如果在范围聚合范围内定义了一组聚合,则将针对定义的范围值来计算子聚合。
Values Source
一些聚合基于另一个聚合的输出。我们为一个聚合设置了field,这个聚合的结果中包含文档中field的值,通常,values会从这些值中抽取。也可以定义一个script来为每一个doc生成一个值,用。
如果为聚合设置了,field和script2个字段,script将被当作value script对待。像普通的scripts在doc级别被评估一样,value script在value级别被评估。在这种模式下,value重field中取得,script被应用于 “transformation” 这些value上。
Elasticsearch使用mapping中的field类型来知道如何运行聚合,并且格式化响应。然后有2中清空,es不能高清楚这些信息,没有别映射的的字段和存脚本。在这种情况下,可以使用value_type选项来制定类型。可用的类型是string,long(适用于所有的integer类型),double,date,ip和boolean。