当前位置: 首页 > article >正文

【Elasticsearch】管道聚合

 

管道聚合就是在已有聚合结果之上在进行聚合,管道聚合是针对于聚合的聚合

 

在 Elasticsearch 中,管道聚合(Pipeline Aggregations)是一种特殊的聚合类型,用于对其他聚合的结果进行进一步的计算和处理,而不是直接从文档集合中提取数据。管道聚合可以基于其他聚合的输出来生成新的聚合结果,从而实现更复杂的数据分析。
管道聚合的主要特点

1. 基于其他聚合的输出:

• 管道聚合不直接处理文档数据,而是对其他聚合的结果进行计算。

• 例如,计算某个聚合结果的导数、移动平均值、最大值等。


2. 链式调用:

• 管道聚合可以链式调用,即一个管道聚合的结果可以作为另一个管道聚合的输入。

• 例如,计算二阶导数(即导数的导数)。


3. 灵活的引用:

• 使用`buckets_path`参数来引用其他聚合的结果。

• 可以引用嵌套聚合的结果,也可以引用同级聚合的结果。


4. 不能有子聚合:

• 管道聚合本身不能包含子聚合,但可以通过引用其他聚合的结果来实现类似的功能。


管道聚合的类型
Elasticsearch 提供了多种类型的管道聚合,每种类型用于不同的计算场景。以下是一些常见的管道聚合类型:


1.导数聚合(Derivative)
计算某个聚合结果的变化率。例如,计算销售额的每日变化率。


```json
{
  "aggs": {
    "sales_per_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "sales"
          }
        },
        "sales_derivative": {
          "derivative": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}
```

2.移动平均聚合(Moving Average)
计算某个聚合结果的移动平均值。例如,计算7天的移动平均销售额。


```json
{
  "aggs": {
    "sales_per_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "sales"
          }
        },
        "moving_avg_sales": {
          "moving_avg": {
            "buckets_path": "total_sales",
            "window": 7
          }
        }
      }
    }
  }
}
```

3.累计和聚合(Cumulative Sum)
计算某个聚合结果的累计和。例如,计算销售额的累计和。


```json
{
  "aggs": {
    "sales_per_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "sales"
          }
        },
        "cumulative_sales": {
          "cumulative_sum": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}
```

4.桶脚本聚合(Bucket Script)
基于多个聚合结果进行自定义计算。例如,计算 T 恤销售额占总销售额的百分比。


```json
{
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "order_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "sales"
          }
        },
        "tshirt_sales_sum": {
          "sum": {
            "field": "tshirt_sales"
          }
        },
        "tshirt_sales_percentage": {
          "bucket_script": {
            "buckets_path": {
              "total": "total_sales",
              "tshirt": "tshirt_sales_sum"
            },
            "script": "params.total > 0 ? (params.tshirt / params.total * 100) : 0"
          }
        }
      }
    }
  }
}
```

5.最大桶聚合(Max Bucket)
从兄弟聚合中选择最大值。例如,计算每月最大销售额。


```json
{
  "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"
      }
    }
  }
}
```

管道聚合的使用场景

1. 时间序列分析:

• 计算时间序列数据的变化率(导数)、移动平均值、累计和等。

• 适用于销售额、流量、温度等时间序列数据的分析。


2. 比例和百分比计算:

• 计算某个指标占总指标的比例或百分比。

• 例如,计算某个产品的销售额占总销售额的百分比。


3. 异常检测:

• 通过计算导数或移动平均值,检测数据中的异常点。

• 例如,检测销售额的突然变化。


4. 多指标比较:

• 使用桶脚本聚合对多个指标进行自定义计算。

• 例如,计算两个指标的比值或差值。


注意事项

1. 性能问题:

• 管道聚合的计算基于其他聚合的结果,可能会增加查询的复杂度和计算时间。

• 在处理大规模数据时,需要特别注意性能优化。


2. `buckets_path`的正确使用:

• 确保`buckets_path`的路径正确,避免路径错误导致查询失败。

• 使用相对路径时,注意路径的层级关系。


3. 脚本的安全性:

• 在使用脚本时,确保脚本逻辑正确,避免除以零等错误。

• 例如,使用条件语句`params.total > 0 ? (params.tshirt / params.total * 100) : 0`。


总结
管道聚合是 Elasticsearch 中一种强大的工具,用于对其他聚合的结果进行进一步的计算和分析。通过合理使用管道聚合,可以实现复杂的数据分析需求,例如时间序列分析、比例计算、异常检测等。掌握管道聚合的使用方法和注意事项,可以帮助你更高效地进行数据分析和查询优化。


http://www.kler.cn/a/540719.html

相关文章:

  • 现代前端开发的演进与未来趋势:从工具革新到技术突破
  • 使用 AlexNet 实现图片分类 | PyTorch 深度学习实战
  • golang 版 E签宝请求签名鉴权方式
  • Unity-Mirror网络框架-从入门到精通之LagCompensation示例
  • openAI官方prompt技巧(一)
  • Swift的方法派发机制
  • SpringBoot源码解析(十):应用上下文AnnotationConfigServletWebServerApplicationContext构造方法
  • 相对收益-固定收益组合归因-前言
  • 纯前度(vue)实现对pdf\mp4\png\jpg\jpegxls\doc\txt文件预览,无需要转化
  • Android图片加载框架Coil,Kotlin
  • 国税局发票查验中英文验证码识别,识别率99.99%
  • 十四. Redis 新功能
  • day10-字符串
  • Spring Boot 与 Kafka 实现高效消息队列通信的最佳实践
  • flutter ListView Item复用源码解析
  • 亲自测试并推荐的第三方平台使用DeepSeek 和 LM Studio 本地部署DeepSeek
  • AI刷题-子数组和的最大值问题
  • 【Java 面试 八股文】Redis篇
  • 数字电路-基础逻辑门实验
  • Day 32 卡玛笔记
  • 基于 GEE 的网格化降雨数据可视化与时间序列分析
  • DeepSeek与AI提示语设计的全面指南
  • 【信息系统项目管理师-案例真题】2018上半年案例分析答案和详解
  • DeepSeek本地部署(解决ollama无法安装问题)
  • 【Java基础篇】——第4篇:Java常用类库与工具类
  • 深度学习-108-大语言模型LLM之基于langchain的结构化输出功能提取结构化信息