- Elasticsearch 指南其他版本
- 8.17 中的新功能
- Elasticsearch 基础
- 快速入门
- 设置 Elasticsearch
- 升级 Elasticsearch
- 索引模块
- 映射
- 文本分析
- 索引模板
- 数据流
- 摄取管道
- 别名
- 搜索您的数据
- 重新排名
- 查询 DSL
- 聚合
- 地理空间分析
- 连接器
- EQL
- ES|QL
- SQL
- 脚本
- 数据管理
- 自动缩放
- 监视集群
- 汇总或转换数据
- 设置高可用性集群
- 快照和还原
- 保护 Elastic Stack 的安全
- Watcher
- 命令行工具
- elasticsearch-certgen
- elasticsearch-certutil
- elasticsearch-create-enrollment-token
- elasticsearch-croneval
- elasticsearch-keystore
- elasticsearch-node
- elasticsearch-reconfigure-node
- elasticsearch-reset-password
- elasticsearch-saml-metadata
- elasticsearch-service-tokens
- elasticsearch-setup-passwords
- elasticsearch-shard
- elasticsearch-syskeygen
- elasticsearch-users
- 优化
- 故障排除
- 修复常见的集群问题
- 诊断未分配的分片
- 向系统中添加丢失的层
- 允许 Elasticsearch 在系统中分配数据
- 允许 Elasticsearch 分配索引
- 索引将索引分配过滤器与数据层节点角色混合,以在数据层之间移动
- 没有足够的节点来分配所有分片副本
- 单个节点上索引的分片总数已超过
- 每个节点的分片总数已达到
- 故障排除损坏
- 修复磁盘空间不足的数据节点
- 修复磁盘空间不足的主节点
- 修复磁盘空间不足的其他角色节点
- 启动索引生命周期管理
- 启动快照生命周期管理
- 从快照恢复
- 故障排除损坏的存储库
- 解决重复的快照策略失败问题
- 故障排除不稳定的集群
- 故障排除发现
- 故障排除监控
- 故障排除转换
- 故障排除 Watcher
- 故障排除搜索
- 故障排除分片容量健康问题
- 故障排除不平衡的集群
- 捕获诊断信息
- REST API
- API 约定
- 通用选项
- REST API 兼容性
- 自动缩放 API
- 行为分析 API
- 紧凑和对齐文本 (CAT) API
- 集群 API
- 跨集群复制 API
- 连接器 API
- 数据流 API
- 文档 API
- 丰富 API
- EQL API
- ES|QL API
- 功能 API
- Fleet API
- 图表探索 API
- 索引 API
- 别名是否存在
- 别名
- 分析
- 分析索引磁盘使用量
- 清除缓存
- 克隆索引
- 关闭索引
- 创建索引
- 创建或更新别名
- 创建或更新组件模板
- 创建或更新索引模板
- 创建或更新索引模板(旧版)
- 删除组件模板
- 删除悬挂索引
- 删除别名
- 删除索引
- 删除索引模板
- 删除索引模板(旧版)
- 存在
- 字段使用情况统计信息
- 刷新
- 强制合并
- 获取别名
- 获取组件模板
- 获取字段映射
- 获取索引
- 获取索引设置
- 获取索引模板
- 获取索引模板(旧版)
- 获取映射
- 导入悬挂索引
- 索引恢复
- 索引段
- 索引分片存储
- 索引统计信息
- 索引模板是否存在(旧版)
- 列出悬挂索引
- 打开索引
- 刷新
- 解析索引
- 解析集群
- 翻转
- 收缩索引
- 模拟索引
- 模拟模板
- 拆分索引
- 解冻索引
- 更新索引设置
- 更新映射
- 索引生命周期管理 API
- 推理 API
- 信息 API
- 摄取 API
- 许可 API
- Logstash API
- 机器学习 API
- 机器学习异常检测 API
- 机器学习数据帧分析 API
- 机器学习训练模型 API
- 迁移 API
- 节点生命周期 API
- 查询规则 API
- 重新加载搜索分析器 API
- 存储库计量 API
- 汇总 API
- 根 API
- 脚本 API
- 搜索 API
- 搜索应用程序 API
- 可搜索快照 API
- 安全 API
- 身份验证
- 更改密码
- 清除缓存
- 清除角色缓存
- 清除权限缓存
- 清除 API 密钥缓存
- 清除服务帐户令牌缓存
- 创建 API 密钥
- 创建或更新应用程序权限
- 创建或更新角色映射
- 创建或更新角色
- 批量创建或更新角色 API
- 批量删除角色 API
- 创建或更新用户
- 创建服务帐户令牌
- 委托 PKI 身份验证
- 删除应用程序权限
- 删除角色映射
- 删除角色
- 删除服务帐户令牌
- 删除用户
- 禁用用户
- 启用用户
- 注册 Kibana
- 注册节点
- 获取 API 密钥信息
- 获取应用程序权限
- 获取内置权限
- 获取角色映射
- 获取角色
- 查询角色
- 获取服务帐户
- 获取服务帐户凭据
- 获取安全设置
- 获取令牌
- 获取用户权限
- 获取用户
- 授予 API 密钥
- 具有权限
- 使 API 密钥失效
- 使令牌失效
- OpenID Connect 准备身份验证
- OpenID Connect 身份验证
- OpenID Connect 注销
- 查询 API 密钥信息
- 查询用户
- 更新 API 密钥
- 更新安全设置
- 批量更新 API 密钥
- SAML 准备身份验证
- SAML 身份验证
- SAML 注销
- SAML 失效
- SAML 完成注销
- SAML 服务提供商元数据
- SSL 证书
- 激活用户配置文件
- 禁用用户配置文件
- 启用用户配置文件
- 获取用户配置文件
- 建议用户配置文件
- 更新用户配置文件数据
- 具有用户配置文件权限
- 创建跨集群 API 密钥
- 更新跨集群 API 密钥
- 快照和还原 API
- 快照生命周期管理 API
- SQL API
- 同义词 API
- 文本结构 API
- 转换 API
- 使用情况 API
- Watcher API
- 定义
- 迁移指南
- 发行说明
- Elasticsearch 版本 8.17.0
- Elasticsearch 版本 8.16.1
- Elasticsearch 版本 8.16.0
- Elasticsearch 版本 8.15.5
- Elasticsearch 版本 8.15.4
- Elasticsearch 版本 8.15.3
- Elasticsearch 版本 8.15.2
- Elasticsearch 版本 8.15.1
- Elasticsearch 版本 8.15.0
- Elasticsearch 版本 8.14.3
- Elasticsearch 版本 8.14.2
- Elasticsearch 版本 8.14.1
- Elasticsearch 版本 8.14.0
- Elasticsearch 版本 8.13.4
- Elasticsearch 版本 8.13.3
- Elasticsearch 版本 8.13.2
- Elasticsearch 版本 8.13.1
- Elasticsearch 版本 8.13.0
- Elasticsearch 版本 8.12.2
- Elasticsearch 版本 8.12.1
- Elasticsearch 版本 8.12.0
- Elasticsearch 版本 8.11.4
- Elasticsearch 版本 8.11.3
- Elasticsearch 版本 8.11.2
- Elasticsearch 版本 8.11.1
- Elasticsearch 版本 8.11.0
- Elasticsearch 版本 8.10.4
- Elasticsearch 版本 8.10.3
- Elasticsearch 版本 8.10.2
- Elasticsearch 版本 8.10.1
- Elasticsearch 版本 8.10.0
- Elasticsearch 版本 8.9.2
- Elasticsearch 版本 8.9.1
- Elasticsearch 版本 8.9.0
- Elasticsearch 版本 8.8.2
- Elasticsearch 版本 8.8.1
- Elasticsearch 版本 8.8.0
- Elasticsearch 版本 8.7.1
- Elasticsearch 版本 8.7.0
- Elasticsearch 版本 8.6.2
- Elasticsearch 版本 8.6.1
- Elasticsearch 版本 8.6.0
- Elasticsearch 版本 8.5.3
- Elasticsearch 版本 8.5.2
- Elasticsearch 版本 8.5.1
- Elasticsearch 版本 8.5.0
- Elasticsearch 版本 8.4.3
- Elasticsearch 版本 8.4.2
- Elasticsearch 版本 8.4.1
- Elasticsearch 版本 8.4.0
- Elasticsearch 版本 8.3.3
- Elasticsearch 版本 8.3.2
- Elasticsearch 版本 8.3.1
- Elasticsearch 版本 8.3.0
- Elasticsearch 版本 8.2.3
- Elasticsearch 版本 8.2.2
- Elasticsearch 版本 8.2.1
- Elasticsearch 版本 8.2.0
- Elasticsearch 版本 8.1.3
- Elasticsearch 版本 8.1.2
- Elasticsearch 版本 8.1.1
- Elasticsearch 版本 8.1.0
- Elasticsearch 版本 8.0.1
- Elasticsearch 版本 8.0.0
- Elasticsearch 版本 8.0.0-rc2
- Elasticsearch 版本 8.0.0-rc1
- Elasticsearch 版本 8.0.0-beta1
- Elasticsearch 版本 8.0.0-alpha2
- Elasticsearch 版本 8.0.0-alpha1
- 依赖项和版本
管道聚合
编辑管道聚合
编辑管道聚合处理其他聚合产生的输出,而不是处理文档集,从而向输出树添加信息。管道聚合有很多不同的类型,每种类型都从其他聚合计算不同的信息,但这些类型可以分为两个系列
- 父级
- 一类管道聚合,它接收其父聚合的输出,并能够计算新的桶或新的聚合以添加到现有桶中。
- 同级
- 一类管道聚合,它接收同级聚合的输出,并能够计算一个新的聚合,该聚合将与同级聚合处于同一级别。
管道聚合可以通过使用 buckets_path
参数来指示所需指标的路径,从而引用它们执行计算所需的聚合。定义这些路径的语法可以在下面的 buckets_path
语法 部分中找到。
管道聚合不能有子聚合,但根据类型,它可以在 buckets_path
中引用另一个管道,从而允许管道聚合链接在一起。例如,您可以将两个导数链接在一起以计算二阶导数(即导数的导数)。
由于管道聚合仅添加到输出中,因此在链接管道聚合时,每个管道聚合的输出都将包含在最终输出中。
buckets_path
语法
编辑大多数管道聚合都需要另一个聚合作为输入。输入聚合通过 buckets_path
参数定义,该参数遵循特定的格式
AGG_SEPARATOR = `>` ; METRIC_SEPARATOR = `.` ; AGG_NAME = <the name of the aggregation> ; METRIC = <the name of the metric (in case of multi-value metrics aggregation)> ; MULTIBUCKET_KEY = `[<KEY_NAME>]` PATH = <AGG_NAME><MULTIBUCKET_KEY>? (<AGG_SEPARATOR>, <AGG_NAME> )* ( <METRIC_SEPARATOR>, <METRIC> ) ;
例如,路径 "my_bucket>my_stats.avg"
将指向 "my_bucket"
桶聚合中包含的 "my_stats"
指标中的 avg
值。
以下是一些更多示例
-
multi_bucket["foo"]>single_bucket>multi_metric.avg
将转到"multi_bucket"
多桶聚合的"foo"
桶内的单个桶"single_bucket"
下的"multi_metric"
聚合中的avg
指标。 -
agg1["foo"]._count
将获取多桶聚合"multi_bucket"
中"foo"
桶的_count
指标
路径相对于管道聚合的位置;它们不是绝对路径,并且路径不能在聚合树中“向上”返回。例如,此导数嵌入在 date_histogram 中,并引用一个“同级”指标 "the_sum"
resp = client.search( aggs={ "my_date_histo": { "date_histogram": { "field": "timestamp", "calendar_interval": "day" }, "aggs": { "the_sum": { "sum": { "field": "lemmings" } }, "the_deriv": { "derivative": { "buckets_path": "the_sum" } } } } }, ) print(resp)
response = client.search( body: { aggregations: { my_date_histo: { date_histogram: { field: 'timestamp', calendar_interval: 'day' }, aggregations: { the_sum: { sum: { field: 'lemmings' } }, the_deriv: { derivative: { buckets_path: 'the_sum' } } } } } } ) puts response
const response = await client.search({ aggs: { my_date_histo: { date_histogram: { field: "timestamp", calendar_interval: "day", }, aggs: { the_sum: { sum: { field: "lemmings", }, }, the_deriv: { derivative: { buckets_path: "the_sum", }, }, }, }, }, }); console.log(response);
POST /_search { "aggs": { "my_date_histo": { "date_histogram": { "field": "timestamp", "calendar_interval": "day" }, "aggs": { "the_sum": { "sum": { "field": "lemmings" } }, "the_deriv": { "derivative": { "buckets_path": "the_sum" } } } } } }
buckets_path
也用于同级管道聚合,其中聚合“紧挨”一系列桶,而不是嵌入在它们“内部”。例如,max_bucket
聚合使用 buckets_path
来指定嵌入在同级聚合中的指标
resp = client.search( aggs={ "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "max_monthly_sales": { "max_bucket": { "buckets_path": "sales_per_month>sales" } } }, ) print(resp)
response = client.search( body: { aggregations: { sales_per_month: { date_histogram: { field: 'date', calendar_interval: 'month' }, aggregations: { sales: { sum: { field: 'price' } } } }, max_monthly_sales: { max_bucket: { buckets_path: 'sales_per_month>sales' } } } } ) puts response
const response = await client.search({ aggs: { sales_per_month: { date_histogram: { field: "date", calendar_interval: "month", }, aggs: { sales: { sum: { field: "price", }, }, }, }, max_monthly_sales: { max_bucket: { buckets_path: "sales_per_month>sales", }, }, }, }); console.log(response);
POST /_search { "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "max_monthly_sales": { "max_bucket": { "buckets_path": "sales_per_month>sales" } } } }
如果同级管道聚合引用多桶聚合(例如 terms
聚合),它也可以选择多桶中的特定键。例如,bucket_script
可以选择两个特定的桶(通过它们的桶键)来执行计算
resp = client.search( aggs={ "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sale_type": { "terms": { "field": "type" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "hat_vs_bag_ratio": { "bucket_script": { "buckets_path": { "hats": "sale_type['hat']>sales", "bags": "sale_type['bag']>sales" }, "script": "params.hats / params.bags" } } } } }, ) print(resp)
response = client.search( body: { aggregations: { sales_per_month: { date_histogram: { field: 'date', calendar_interval: 'month' }, aggregations: { sale_type: { terms: { field: 'type' }, aggregations: { sales: { sum: { field: 'price' } } } }, hat_vs_bag_ratio: { bucket_script: { buckets_path: { hats: "sale_type['hat']>sales", bags: "sale_type['bag']>sales" }, script: 'params.hats / params.bags' } } } } } } ) puts response
const response = await client.search({ aggs: { sales_per_month: { date_histogram: { field: "date", calendar_interval: "month", }, aggs: { sale_type: { terms: { field: "type", }, aggs: { sales: { sum: { field: "price", }, }, }, }, hat_vs_bag_ratio: { bucket_script: { buckets_path: { hats: "sale_type['hat']>sales", bags: "sale_type['bag']>sales", }, script: "params.hats / params.bags", }, }, }, }, }, }); console.log(response);
POST /_search { "aggs": { "sales_per_month": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "sale_type": { "terms": { "field": "type" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "hat_vs_bag_ratio": { "bucket_script": { "buckets_path": { "hats": "sale_type['hat']>sales", "bags": "sale_type['bag']>sales" }, "script": "params.hats / params.bags" } } } } } }
特殊路径
编辑除了指向指标外,buckets_path
还可以使用特殊的 "_count"
路径。这指示管道聚合使用文档计数作为其输入。例如,可以计算每个桶的文档计数的导数,而不是特定指标
resp = client.search( aggs={ "my_date_histo": { "date_histogram": { "field": "timestamp", "calendar_interval": "day" }, "aggs": { "the_deriv": { "derivative": { "buckets_path": "_count" } } } } }, ) print(resp)
response = client.search( body: { aggregations: { my_date_histo: { date_histogram: { field: 'timestamp', calendar_interval: 'day' }, aggregations: { the_deriv: { derivative: { buckets_path: '_count' } } } } } } ) puts response
const response = await client.search({ aggs: { my_date_histo: { date_histogram: { field: "timestamp", calendar_interval: "day", }, aggs: { the_deriv: { derivative: { buckets_path: "_count", }, }, }, }, }, }); console.log(response);
POST /_search { "aggs": { "my_date_histo": { "date_histogram": { "field": "timestamp", "calendar_interval": "day" }, "aggs": { "the_deriv": { "derivative": { "buckets_path": "_count" } } } } } }
buckets_path
还可以使用 "_bucket_count"
并指向一个多桶聚合,以在管道聚合中使用该聚合返回的桶数,而不是指标。例如,这里可以使用 bucket_selector
来过滤掉内部术语聚合中不包含桶的桶
resp = client.search( index="sales", size=0, aggs={ "histo": { "date_histogram": { "field": "date", "calendar_interval": "day" }, "aggs": { "categories": { "terms": { "field": "category" } }, "min_bucket_selector": { "bucket_selector": { "buckets_path": { "count": "categories._bucket_count" }, "script": { "source": "params.count != 0" } } } } } }, ) print(resp)
response = client.search( index: 'sales', body: { size: 0, aggregations: { histo: { date_histogram: { field: 'date', calendar_interval: 'day' }, aggregations: { categories: { terms: { field: 'category' } }, min_bucket_selector: { bucket_selector: { buckets_path: { count: 'categories._bucket_count' }, script: { source: 'params.count != 0' } } } } } } } ) puts response
const response = await client.search({ index: "sales", size: 0, aggs: { histo: { date_histogram: { field: "date", calendar_interval: "day", }, aggs: { categories: { terms: { field: "category", }, }, min_bucket_selector: { bucket_selector: { buckets_path: { count: "categories._bucket_count", }, script: { source: "params.count != 0", }, }, }, }, }, }, }); console.log(response);
POST /sales/_search { "size": 0, "aggs": { "histo": { "date_histogram": { "field": "date", "calendar_interval": "day" }, "aggs": { "categories": { "terms": { "field": "category" } }, "min_bucket_selector": { "bucket_selector": { "buckets_path": { "count": "categories._bucket_count" }, "script": { "source": "params.count != 0" } } } } } } }
处理聚合名称中的点
编辑支持另一种语法来处理名称中有点的聚合或指标,例如第 99.9
个 百分位数。此指标可以称为
"buckets_path": "my_percentile[99.9]"
处理数据中的间隙
编辑现实世界中的数据通常是嘈杂的,有时包含 间隙,即数据根本不存在的地方。这可能是由于多种原因造成的,最常见的原因是
- 落入桶的文档不包含必需的字段
- 一个或多个桶没有匹配查询的文档
- 计算的指标无法生成值,很可能是因为另一个依赖桶缺少值。一些管道聚合具有必须满足的特定要求(例如,导数无法计算第一个值的指标,因为它没有先前的值,HoltWinters 移动平均线需要“预热”数据才能开始计算等)
间隙策略是一种机制,用于在遇到“有间隙”或缺少数据时通知管道聚合所需的行为。所有管道聚合都接受 gap_policy
参数。目前有两种间隙策略可供选择
- 跳过
- 此选项将缺少的数据视为该桶不存在。它将跳过该桶,并继续使用下一个可用值进行计算。
- 插入零
- 此选项会将缺失的值替换为零 (
0
),并且管道聚合计算将照常进行。 - 保留值
- 此选项与跳过类似,但如果指标提供非空、非 NaN 值,则使用此值,否则将跳过空桶。
On this page