Link Search Menu Expand Document Documentation Menu

聚合

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

聚合的使用场景多种多样,从实时分析数据以采取行动,到使用 OpenSearch Dashboards 创建可视化仪表板。

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

文本字段上的聚合

默认情况下,OpenSearch 不支持对文本字段进行聚合。因为文本字段是经过分词的,所以对文本字段进行聚合需要将分词过程反转回原始字符串,然后基于此进行聚合。这种操作会消耗大量内存并降低集群性能。

虽然您可以通过在映射中将 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),您可以定义任意数量的聚合。每个聚合都由其名称和 OpenSearch 支持的一种聚合类型定义。

聚合的名称有助于您区分响应中的不同聚合。AGG_TYPE 属性是您指定聚合类型的地方。

聚合示例

本节使用 OpenSearch Dashboards 示例电子商务数据和 Web 日志数据。要添加示例数据,请登录 OpenSearch Dashboards,选择 Home,然后选择 Try our sample data。对于 Sample eCommerce ordersSample web logs,选择 Add data

avg

查找 taxful_total_price 字段的平均值

GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "avg_taxful_total_price": {
      "avg": {
        "field": "taxful_total_price"
      }
    }
  }
}

示例响应

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4675,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "avg_taxful_total_price" : {
      "value" : 75.05542864304813
    }
  }
}

响应中的聚合块显示了 taxful_total_price 字段的平均值。

聚合类型

聚合主要有三种类型

  • 度量聚合 - 计算数值字段的度量,例如 summinmaxavg
  • 桶聚合 - 根据某些条件将查询结果分类到组中。
  • 管道聚合 - 将一个聚合的输出作为另一个聚合的输入。

嵌套聚合

聚合内部的聚合称为嵌套聚合或子聚合。

度量聚合产生简单结果,不能包含嵌套聚合。

桶聚合产生文档桶,您可以将其嵌套在其他聚合中。通过在桶聚合中嵌套度量聚合和桶聚合,您可以对数据执行复杂分析。

通用嵌套聚合语法

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

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

您还可以将聚合与搜索查询结合使用,以便在聚合之前缩小要分析的内容。如果您不添加查询,OpenSearch 会隐式使用 match_all 查询。

限制

因为所有值都使用 double 数据类型进行处理,所以大于或等于 253long 值是近似值。

剩余 350 字符

有问题?

想要贡献?