首页 > 其他分享 >ElasticSearch - Bucket Script 使用指南

ElasticSearch - Bucket Script 使用指南

时间:2024-10-29 19:45:02浏览次数:9  
标签:total 聚合 shirt script Bucket sales ElasticSearch date 使用指南

文章目录

在这里插入图片描述


官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

在这里插入图片描述在这里插入图片描述


Bucket Script 官文

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-script-aggregation.html

在这里插入图片描述在这里插入图片描述
在这里插入图片描述


  1. 介绍 Bucket Script 的概念和作用
  2. 展示基本使用场景,帮助理解其核心原理
  3. 通过实例展示如何实现 Bucket Script
  4. 总结关键要点与最佳实践

1. 什么是 ElasticSearch 中的 Bucket Script?

Bucket Script 是 ElasticSearch 中一种强大的管道聚合(pipeline aggregation),允许你基于已有的聚合结果执行数学计算。 它用于对多个 桶(buckets) 内的数据进行后处理,适合在聚合结果上进行进一步计算,比如计算比率、加权平均等。


2. 适用场景

  • 计算字段的 百分比(如收入增长率)
  • 生成两个字段之间的 比值(如点击率 CTR)
  • 在聚合结果中求得更复杂的 数学表达式
  • 处理基于时间序列的数据分析,例如 同比、环比 增长计算

3. Bucket Script 的基本结构

Bucket Script 聚合的基本结构如下:

{
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "order_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "sales"
          }
        },
        "total_units": {
          "sum": {
            "field": "units_sold"
          }
        },
        "sales_per_unit": {
          "bucket_script": {
            "buckets_path": {
              "sales": "total_sales",
              "units": "total_units"
            },
            "script": "params.sales / params.units"
          }
        }
      }
    }
  }
}
  1. sales_per_month:使用 date_histogram 按月份进行分桶。
  2. total_salestotal_units:分别计算总销售额和总售出单位数。
  3. sales_per_unit:使用 bucket_script 在每个桶内计算销售额与售出单位的比值。

4. 关键参数详解

  • buckets_path:指定需要参与计算的聚合结果路径,路径指向的聚合必须出现在当前或上层的桶中。
  • script:定义计算逻辑,使用 Painless 脚本语言 编写。

5. 示例

官方示例:计算每月 T 恤销售额占总销售额的比率百分比

PUT /sales
{
  "mappings": {
    "properties": {
      "type": {
        "type": "keyword"
      },
      "price": {
        "type": "float"
      },
      "date": {
        "type": "date"
      }
    }
  }
}


POST /sales/_bulk
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 19.99, "date": "2024-01-05" }
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 25.50, "date": "2024-01-15" }
{ "index": { "_index": "sales" } }
{ "type": "jeans", "price": 49.99, "date": "2024-01-20" }
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 15.99, "date": "2024-02-01" }
{ "index": { "_index": "sales" } }
{ "type": "shoes", "price": 75.00, "date": "2024-02-10" }
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 29.99, "date": "2024-02-15" }

POST sales/_search

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "price"
          }
        },
        "t-shirts": {
          "filter": {
            "term": {
              "type": "t-shirt"
            }
          },
          "aggs": {
            "sales": {
              "sum": {
                "field": "price"
              }
            }
          }
        },
        "t-shirt-percentage": {
          "bucket_script": {
            "buckets_path": {
              "tShirtSales": "t-shirts>sales",
              "totalSales": "total_sales"
            },
            "script": "params.tShirtSales / params.totalSales * 100"
          }
        }
      }
    }
  }
}

此查询的目的是:

  1. 统计每个月的总销售额
  2. 计算“T-shirt”类型商品的销售额
  3. 计算“T-shirt”销售额占总销售额的百分比

  1. “size”: 0

    • 表示这次查询不返回任何文档,仅返回聚合结果。
  2. 聚合:sales_per_month

    • 使用 date_histogram 来按月对销售数据进行分桶:
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      }
      
    • 字段 date 决定销售的日期。calendar_interval 设置为 "month",意味着每个月作为一个桶。
  3. 聚合:total_sales

    • 计算每个月的总销售额
      "total_sales": {
        "sum": {
          "field": "price"
        }
      }
      
    • 字段 price 表示商品价格,通过 sum 聚合计算总和。
  4. 过滤聚合:t-shirts

    • 使用 filter 过滤出类型为 t-shirt 的销售:
      "filter": {
        "term": {
          "type": "t-shirt"
        }
      }
      
    • 嵌套的sum聚合 计算T-shirt类型商品的销售额:
      "sales": {
        "sum": {
          "field": "price"
        }
      }
      
  5. 桶脚本聚合:t-shirt-percentage

    • 计算T-shirt销售额占总销售额的百分比
      "bucket_script": {
        "buckets_path": {
          "tShirtSales": "t-shirts>sales",
          "totalSales": "total_sales"
        },
        "script": "params.tShirtSales / params.totalSales * 100"
      }
      
    • buckets_path 用于从其他聚合中引用路径:
      • "tShirtSales" 引用的是 t-shirts>sales 聚合。
      • "totalSales" 引用的是 total_sales 聚合。
    • script 执行的逻辑是:T-shirt销售额 / 总销售额 * 100,计算百分比。

查询结果格式

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "sales_per_month" : {
      "buckets" : [
        {
          "key_as_string" : "2024-01-01T00:00:00.000Z",
          "key" : 1704067200000,
          "doc_count" : 3,
          "total_sales" : {
            "value" : 95.48000144958496
          },
          "t-shirts" : {
            "doc_count" : 2,
            "sales" : {
              "value" : 45.489999771118164
            }
          },
          "t-shirt-percentage" : {
            "value" : 47.64348458366713
          }
        },
        {
          "key_as_string" : "2024-02-01T00:00:00.000Z",
          "key" : 1706745600000,
          "doc_count" : 3,
          "total_sales" : {
            "value" : 120.97999954223633
          },
          "t-shirts" : {
            "doc_count" : 2,
            "sales" : {
              "value" : 45.97999954223633
            }
          },
          "t-shirt-percentage" : {
            "value" : 38.00628179551602
          }
        }
      ]
    }
  }
}

这个结果表示:

  • 2024年1月的总销售额为 ** 95.48**。
  • 其中 45.48 元来自于 T-shirt。
  • T-shirt 的销售占比为 ** 47.6%**。


示例计算:点击率 (CTR)

假设有个广告展示量和点击量的聚合,想计算每个广告的点击率:

{
  "aggs": {
    "ads": {
      "terms": {
        "field": "ad_id"
      },
      "aggs": {
        "impressions": {
          "sum": {
            "field": "impression_count"
          }
        },
        "clicks": {
          "sum": {
            "field": "click_count"
          }
        },
        "ctr": {
          "bucket_script": {
            "buckets_path": {
              "clicks": "clicks",
              "impressions": "impressions"
            },
            "script": "params.clicks / params.impressions"
          }
        }
      }
    }
  }
}

逻辑:

  • 使用 terms 聚合按广告 ID 分组
  • 分别计算广告的展示量 (impressions) 和点击量 (clicks)
  • 使用 bucket_script 聚合计算 点击率(CTR) = 点击量 / 展示量

6. 注意事项与限制

  1. 性能影响:由于 Bucket Script 在已有聚合结果上执行计算,处理大量桶时可能会导致性能下降。
  2. 路径依赖buckets_path 必须引用当前层级内或父层级的聚合结果,不能跨层级引用。
  3. 脚本限制:ElasticSearch 默认使用 Painless 脚本, 确保脚本逻辑高效,否则可能导致查询超时。
  4. 溢出处理:注意在脚本中处理除零异常或数据溢出。

7. 最佳实践

  • 数据过滤:提前过滤无关数据,减少参与计算的桶数。
  • 逐步聚合:将复杂计算分解为多个简单的管道聚合,以提高可读性和维护性。
  • 性能调优:如果计算复杂,可以限制返回结果的桶数(例如通过 size 限制 top-N 结果)。

在这里插入图片描述

标签:total,聚合,shirt,script,Bucket,sales,ElasticSearch,date,使用指南
From: https://blog.csdn.net/yangshangwei/article/details/143327404

相关文章

  • 【JumpServer教程】简便添加Windows资产:JumpServer堡垒机使用指南
    简介:本文是JumpServer堡垒机使用指南,介绍了如何在JumpServer中简便添加Windows资产的步骤,包括准备工作、开启Windows远程设置、在JumpServer中配置Windows资产以及授权使用。一、背景在很多时候,还有些传统公司,使用的是windowsserver服务器,所以对于这类资产如何管理呢?别急,ju......
  • 《DNK210使用指南 -CanMV版 V1.0》第三十四章 image图像滤波实验
    第三十四章image图像滤波实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)......
  • 【项目实战】分布式日志搜索系统之数据同步方案(Logstash-input-jdbc、go-mysql-elast
    在构建分布式日志搜索系统时,数据同步是一个核心环节。以下是针对您提出的五种数据同步方案的详细分析:一、Logstash-input-jdbcLogstash是ElasticStack的一部分,用于从各种来源收集数据,并将其发送到Elasticsearch。Logstash-input-jdbc插件允许Logstash从关系型数据库(如My......
  • Bootstrap使用指南:快速构建响应式网页的利器
    引言在前端开发的领域,Bootstrap是一个备受欢迎的CSS框架,它通过预先定义的样式和组件布局,极大地提高了开发效率并降低了从零开始的复杂度。如果你希望在短时间内构建美观、响应式的网站,Bootstrap无疑是你的好帮手。然而,新手在学习和使用Bootstrap时常常会遇到一些问题。今天,我......
  • Rust整合Elasticsearch
    Elasticsearch是什么Lucene:Java实现的搜索引擎类库易扩展高性能仅限Java开发不支持水平扩展Elasticsearch:基于Lucene开发的分布式搜索和分析引擎支持分布式、水平扩展提高RestfulAPI,可被任何语言调用ElasticStack是什么ELK(ElasticStack):Elasticsearch结合Kibana、Log......
  • elasticsearch使用
    1、选择1、ElasticsearchRestTemplate是spring对官方HighLevelRESTClient的封装。2、ElasticSearch8.x弃用了HighLevelRESTClient,移除了JavaTransportClient,推荐使用ElasticsearchJavaAPI(后续使用8的建议使用ElasticsearchJavaAPI)2、ElasticsearchRestTemp......
  • ElasticSearch安装与使用
    一、ElasticSearch的安装下载ElasticSearch安装包可以从ElasticSearch的官方网站下载相应版本的安装包。或者,在Linux系统中,可以使用wget命令下载,例如:wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.x.x-linux-x86_64.tar.gz(请将7.x.x替换为具......
  • 为什么需要 ElasticSearch
    在当今数字化时代,数据已经成为企业最重要的资产之一。然而,随着数据量的指数级增长,企业在数据处理方面面临着前所未有的挑战。本文将深入探讨为什么ElasticSearch成为了解决这些挑战的关键技术之一。当代数据处理的挑战现代企业在数据处理方面主要面临以下几个典型挑战:......
  • ElasticSearch 入门需要了解的概念
    引言:ElasticSearch的定位与应用ElasticSearch是一个分布式搜索和分析引擎。想象它是一个超大的图书馆:可以快速找到任何书籍(搜索能力)可以统计各类书籍的数量(分析能力)可以随时添加新书架(可扩展性)即使某个书架损坏,其他书架的书仍然可读(高可用性)主要应用场景:网站搜索日志......
  • Go Zero 用户服务代码结构解析与深度使用指南
    目录GoZero用户服务代码结构解析与深度使用指南一、代码结构解析(一)整体结构概述(二)各部分详细解析(三)user.go文件二、GoZero使用指南(一).api文件和.proto文件的生成(二)服务开发流程在当今快速发展的软件开发领域,选择合适的框架来构建高效、可靠的服务至关重要。Go......