聚合

聚合 #

Easysearch 不仅用于搜索。聚合功能利用 Easysearch 强大的分析引擎来分析数据并从中提取统计信息。

Easysearch 可以在毫秒内对海量数据集进行聚合。与查询相比,聚合会消耗更多的 CPU 周期和内存。

关于文本字段上的聚合 #

默认情况下,Easysearch 不支持对文本字段进行聚合。因为文本字段会被分词,所以对文本字段进行聚合时必须将分词过程逆向转换回原始字符串,然后基于此进行聚合。这种操作会消耗大量内存并降低集群性能

虽然可以通过在映射中将 fielddata 参数设置为 true 来启用对文本字段的聚合,但这些聚合仍然基于分词后的单词,而不是原始文本。

我们建议保留文本字段的原始版本作为 keyword 字段,以便进行聚合。

在这种情况下,可以对 title.raw 字段进行聚合,而不是对 title 字段进行聚合:

PUT movies
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fielddata": true,
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

聚合的基本结构 #

聚合查询的结构如下:

GET _search
{
  "size": 0,
  "aggs": {
    "NAME": {
      "AGG_TYPE": {}
    }
  }
}

如果只对聚合结果感兴趣,而不关心查询结果,则将 size 设置为 0。

aggs 属性(如果想使用的话,可以使用 aggregations )中,可以定义任意数量的聚合。每个聚合由其名称和 Easysearch 支持的一种聚合类型定义。

聚合的名称有助于在响应中区分不同的聚合。 AGG_TYPE 属性用于指定聚合的类型。

聚合类型 #

主要有三种聚合类型:

  1. 指标聚合 - 计算数值字段上的指标,如 sum 、 min 、 max 和 avg 。
  2. 分组聚合 - 根据某些标准将查询结果分组分组。
  3. 管道聚合 - 将一个聚合的输出作为另一个聚合的输入。

嵌套聚合 #

嵌套聚合或子聚合是指在聚合内部进行的聚合。

指标聚合生成简单的结果,不能包含嵌套聚合。

分组聚合生成文档的组,可以在其他聚合中嵌套。通过在分组聚合内部嵌套指标和分组聚合,可以对数据进行复杂的分析。

通用的嵌套聚合语法 #

{
  "aggs": {
    "name": {
      "type": {
        "data"
      },
      "aggs": {
        "nested": {
          "type": {
            "data"
          }
        }
      }
    }
  }
}

内层 aggs 关键字开始一个新的嵌套聚合。父聚合和嵌套聚合的语法相同。嵌套聚合在前一个父聚合的上下文中运行。

还可以将聚合与搜索查询配对,以便在聚合之前缩小分析范围。如果不添加查询,Easysearch 会隐式使用 match_all 查询。

限制 #

由于聚合器会使用 double 数据类型处理所有值, long 值在 2^53 及以上均为近似值。