Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合
在上上一篇中介绍了ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程,介绍了ElasticSearch Java API基础的语法,基本的增删改查(对应SQL语句), 本篇则来介绍一下ElasticSearch 聚合查询的使用JAVA API 和 DSL语句的使用 。
聚合框架有助于基于搜索查询提供聚合数据。它基于称为聚合的简单构建块,可以进行组合以构建复杂的数据摘要。 聚合可以看作是在一组文档上建立分析信息的工作单元。执行的上下文定义此文档集是什么(例如,顶级聚合在搜索请求的已执行查询/过滤器的上下文中执行)。 有许多不同类型的聚合,每种聚合都有自己的目的和输出。为了更好地理解这些类型,通常更容易将它们分为四个主要家族:
在一组文档上跟踪和计算指标的聚合。这些值通常是从文档的字段中提取的(使用字段数据),但也可以使用脚本生成。
生成存储桶的一组聚合,其中每个存储桶都与一个键和一个文档条件相关联。执行聚合时,将对上下文中的每个文档评估所有存储桶条件,并且当条件匹配时,该文档将被视为“落入”相关存储桶。到聚合过程结束时,我们将得到一个存储桶列表-每个存储桶都有一组“属于”的文档。
操作多个字段并根据从请求的文档字段中提取的值生成矩阵结果的集合。与Metric和Bucketing不同,这个聚合不支持脚本!
它聚合其他聚合的输出及其相关的Metric。
由于每个存储桶有效地定义了一个文档集(所有文件都属于该存储桶),因此可以潜在地在存储桶级别关联聚合,并且这些聚合将在该存储桶的上下文中执行。这就是聚合真正的力量所在:聚合可以嵌套!
存储桶聚合可以具有子聚合(存储桶或指标)。子聚合将针对其父聚合生成的存储桶进行计算。嵌套聚合的级别/深度没有硬性限制(可以将一个聚合嵌套在“父”聚合下,该“父”聚合本身是另一种更高级别的聚合的子聚合)。 聚合作用于double数据的表示形式。因此,当运行绝对值大于的多头时,结果可能是近似的2^53。
数值指标聚合是一种特殊类型的指标聚合,可输出数值。一些聚合输出单个数值度量(例如avg)并被称为single-value numeric metrics aggregation,其他聚合则生成多个度量(例如stats)并被称为multi-value numeric metrics aggregation。当这些值充当某些存储桶聚合的直接子聚合(某些存储桶聚合使您可以基于每个存储桶中的数字度量对返回的存储桶进行排序)时,单值和多值数字度量聚合之间的区别将发挥作用。
度量(Metric)聚合在ElasticSearch官方文档中有很中聚合,这里我只列举我们最常用的几个聚合示例。
计算的平均个从聚集的文档中提取数值。这些值可以从文档中的特定数字字段中提取,也可以由提供的脚本生成。
这里我们用一个示例来进行说明,得到一个班级的学生分数平均分数。
DSL语句示例:
POST /student/_search?size=0 { "aggs" : { "avg_grade" : { "avg" : { "field" : "grade" } } } } 复制代码
注: grade 字段类型必须是整型
当然,如果成绩还包含权重(weight)的话,我们可以为其添加权重. 权重: 在计算常规平均值时,每个数据点都具有相等的``权重''...它对最终值的贡献均等。可以理解为权重值越大,就越靠前,加权公式为: ∑(value * weight) / ∑(weight).
DSL语句示例:
POST /student/_search { "size": 0, "aggs" : { "weighted_grade": { "weighted_avg": { "value": { "field": "grade" }, "weight": { "field": "weight" } } } } } 复制代码
这里我们用一个示例来进行说明,得到班级的最高分和最低分。
DSL语句示例:
POST /student/_search?size=0 { "aggs" : { "max_grade" : { "max" : { "field" : "grade" } } } } POST /student/_search?size=0 { "aggs" : { "min_grade" : { "min" : { "field" : "grade" } } } } 复制代码
得到某字段总和的值。
DSL语句示例:
POST /student/_search?size=0 { "aggs" : { "sum_grade" : { "sum" : { "field" : "grade" } } } } 复制代码
一个top_hits指标聚合不断被聚合跟踪最相关的文档。该聚合器旨在用作子聚合器,以便可以按存储分区汇总最匹配的文档。该top_hits聚合器可以有效地通过某些字段经由铲斗聚合器用于将结果集。一个或多个存储桶聚合器确定将结果集切成哪些属性。
选件