Elasticsearch聚合过滤器根据钥匙的另一个滤波器存储桶的一个过滤器的结果

发布于 2025-01-23 03:12:43 字数 2950 浏览 1 评论 0原文

我想查询类似于

select t1.plate_no,t1.cnt1,t2.cnt2 from 

(select plate_no,sum(pass_count) cnt1 from kdmotorvehicle where pass_time > '2022-04-01 03:00:00' group by plate_no having cnt1 >5 ) t1 
left join 
(select plate_no,sum(pass_count) cnt2 from kdmotorvehicle where pass_time < '2022-05-18 23:00:00' group by plate_no having cnt2 <10 ) t2 
on t1.plate_no = t2.plate_no

要实现业务逻辑 使用DSL

Idea是:找出相应的聚合,每个聚合桶中的两个过滤桶,然后要过滤结果合并,

{
  "size": 0,
  "aggs": {
    "before_filter": {
      "filter": {
        "range": {
          "pass_time": {
            "gte": "2022-04-06 00:00:00",
            "lte": "2022-04-10 23:00:00"
          }
        }
      },
      "aggs": {
        "group_by_plate_no_color": {
          "terms": {
            "script": {
              "source": "doc['plate_no'].value+','+doc['plate_color'].value",
              "lang": "painless"
            },
            "order": {
              "pass_count_total": "desc"
            },
            "size": 10000
          },
          "aggs": {
            "pass_count_total": {
              "sum": {
                "field": "pass_count"
              }
            },
            "having": {
              "bucket_selector": {
                "buckets_path": {
                  "cnt": "pass_count_total"
                },
                "script": {
                  "source": "params.cnt >= params.before_cnt",
                  "lang": "painless",
                  "params": {
                    "before_cnt": 10
                  }
                },
                "gap_policy": "skip"
              }
            }
          }
        }
      }
    },
    "after_filter": {
      "filter": {
        "range": {
          "pass_time": {
            "gte": "2022-04-11 00:00:00",
            "lte": "2022-04-16 23:00:00"
          }
        }
      },
      "aggs": {
        "group_by_plate_no_color": {
          "terms": {
            "script": {
              "source": "doc['plate_no'].value+','+doc['plate_color'].value",
              "lang": "painless"
            },
            "order": {
              "pass_count_total": "desc"
            },
            "size": 10000
          },
          "aggs": {
            "pass_count_total": {
              "sum": {
                "field": "pass_count"
              }
            },
            "having": {
              "bucket_selector": {
                "buckets_path": {
                  "cnt": "pass_count_total"
                },
                "script": {
                  "source": "params.cnt <= params.after_cnt",
                  "lang": "painless",
                  "params": {
                    "after_cnt": 1
                  }
                },
                "gap_policy": "skip"
              }
            }
          }
        }
      }
    }
  }
}

但是,不知道如何说两个桶以合并过滤器的结果,试图使用管道聚合,但是这是只能在过滤桶上使用

I want to query is similar to

select t1.plate_no,t1.cnt1,t2.cnt2 from 

(select plate_no,sum(pass_count) cnt1 from kdmotorvehicle where pass_time > '2022-04-01 03:00:00' group by plate_no having cnt1 >5 ) t1 
left join 
(select plate_no,sum(pass_count) cnt2 from kdmotorvehicle where pass_time < '2022-05-18 23:00:00' group by plate_no having cnt2 <10 ) t2 
on t1.plate_no = t2.plate_no

Want to achieve the business logic
use dsl

Idea is: find out the corresponding polymerization, each in two filtering barrel, and then to filter results merging

{
  "size": 0,
  "aggs": {
    "before_filter": {
      "filter": {
        "range": {
          "pass_time": {
            "gte": "2022-04-06 00:00:00",
            "lte": "2022-04-10 23:00:00"
          }
        }
      },
      "aggs": {
        "group_by_plate_no_color": {
          "terms": {
            "script": {
              "source": "doc['plate_no'].value+','+doc['plate_color'].value",
              "lang": "painless"
            },
            "order": {
              "pass_count_total": "desc"
            },
            "size": 10000
          },
          "aggs": {
            "pass_count_total": {
              "sum": {
                "field": "pass_count"
              }
            },
            "having": {
              "bucket_selector": {
                "buckets_path": {
                  "cnt": "pass_count_total"
                },
                "script": {
                  "source": "params.cnt >= params.before_cnt",
                  "lang": "painless",
                  "params": {
                    "before_cnt": 10
                  }
                },
                "gap_policy": "skip"
              }
            }
          }
        }
      }
    },
    "after_filter": {
      "filter": {
        "range": {
          "pass_time": {
            "gte": "2022-04-11 00:00:00",
            "lte": "2022-04-16 23:00:00"
          }
        }
      },
      "aggs": {
        "group_by_plate_no_color": {
          "terms": {
            "script": {
              "source": "doc['plate_no'].value+','+doc['plate_color'].value",
              "lang": "painless"
            },
            "order": {
              "pass_count_total": "desc"
            },
            "size": 10000
          },
          "aggs": {
            "pass_count_total": {
              "sum": {
                "field": "pass_count"
              }
            },
            "having": {
              "bucket_selector": {
                "buckets_path": {
                  "cnt": "pass_count_total"
                },
                "script": {
                  "source": "params.cnt <= params.after_cnt",
                  "lang": "painless",
                  "params": {
                    "after_cnt": 1
                  }
                },
                "gap_policy": "skip"
              }
            }
          }
        }
      }
    }
  }
}

But, don't know how to speak two barrels to merge the result of the filter, tried to use pipe aggregation, but this can only be used on a filtering barrel

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文