• elasticsearch实现聚合后两个字段相除相加相减相乘运算


    1、实际需求

    在sum聚合运算时会有两个值sum之后相除的运算方式sum(A)/sum(B),这就需要用到es的Bucket ScriptAggregation聚合方式。

    备注:由于这个问题是一年之前遇到的,现在的新版ES应该有细微变化了,具体的可能需要重测试,但是评论区有人给出了新版的方法,可以尝试一下。

    "aggregations" : {
       "A" : {
         "sum" : {
           "field" : "A"
         }
       },
       "B" : {
         "sum" : {
           "field" : "B"
         }
       },
       "(A/B)" : {
         "bucket_script" : {
           "script" : {
             "inline" : "tmpA/tmpB"
           },
           "buckets_path" : {
             "tmpA" : "A",
             "tmpB" : "B"
           }
         }
       }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    bucket_path字段是一个映射map,用别名映射A和B聚合的桶,然后再在script中做脚本运算,但是es不支持按照聚合生成字段“(A/B)”排序。

    2、Pipeline Aggregations(管道聚合)

    sum和bucket_script聚合都是管道聚合(Pipeline)

    Pipeline Aggregations 是一组工作在其他聚合计算结果而不是文档集合的聚合。
    有很多种不同类型的 Pipeline Aggregations ,不同的 Pipeline Aggregations 对其他聚合计算结果有不同的聚合计算。
    总的来说 Pipeline Aggregations 有以下两种类型:

    1. Parent: 以父聚合的结果作为输入,对父聚合的结果进行聚合计算。可以计算出新的桶或是新的聚合结果加入到现有的桶中。
    2. Sibling: 以兄弟聚合(同级聚合)的结果作为输入,对兄弟聚合的结果进行聚合计算。计算出一个新的聚合结果,结果与兄弟聚合的结果同级。

    Buckets Path Syntax

    Pipeline Aggregations 是针对于其他聚合结果进行聚合计算的聚合,所以需要做到的一点是如何指出需要进行聚合计算的其他聚合。每个 Pipeline Aggregations 都会有一个buckets_path__参数,用于指定其他聚合。
    Pipeline Aggregations 不可以具有子聚合,但是根据类型,可以通过 buckets_path 引用另一个 Pipeline Aggregations ,使管道聚合链接起来。

  • 相关阅读:
    JVM类加载双亲委派机制在漏洞利用时的使用
    leetcode做题笔记169. 多数元素
    Mac 开发Monkey脚本自动化测试Android应用二
    redis异常:OOM command not allowed when used memory > ‘maxmemory‘
    linux命令汇总
    数据结构知识点总结12-(第六章.图)-图的存储结构及图的遍历
    YOLOv8 多种任务网络结构详细解析 | 目标检测、实例分割、人体关键点检测、图像分类
    我的创作纪念日
    隐私计算 FATE - 多分类神经网络算法测试
    gitlab的使用
  • 原文地址:https://blog.csdn.net/begefefsef/article/details/126361945