聚合
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 orders 和 Sample 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
字段的平均值。
聚合类型
聚合主要有三种类型
- 度量聚合 - 计算数值字段的度量,例如
sum
、min
、max
和avg
。 - 桶聚合 - 根据某些条件将查询结果分类到组中。
- 管道聚合 - 将一个聚合的输出作为另一个聚合的输入。
嵌套聚合
聚合内部的聚合称为嵌套聚合或子聚合。
度量聚合产生简单结果,不能包含嵌套聚合。
桶聚合产生文档桶,您可以将其嵌套在其他聚合中。通过在桶聚合中嵌套度量聚合和桶聚合,您可以对数据执行复杂分析。
通用嵌套聚合语法
{
"aggs": {
"name": {
"type": {
"data"
},
"aggs": {
"nested": {
"type": {
"data"
}
}
}
}
}
}
内部的 aggs
关键字开始一个新的嵌套聚合。父聚合和嵌套聚合的语法是相同的。嵌套聚合在前一个父聚合的上下文中运行。
您还可以将聚合与搜索查询结合使用,以便在聚合之前缩小要分析的内容。如果您不添加查询,OpenSearch 会隐式使用 match_all
查询。
限制
因为所有值都使用 double
数据类型进行处理,所以大于或等于 253 的 long
值是近似值。