ES两次桶聚合查询最近一条记录值与前几天平均值的差值大于一个固定值

问题描述:

    某张记录用户用量信息的表(“id”, “rid”, “userName”, “userNo”, “telephone”, “addressDetail”, “usage”, “time”),查询用户 最近一次用量记录 与 前五天用量记录的平均值 的差值 大于0.5的用户信息。
 (此查询较慢,待优化,可以选择将size改小)

{
  "aggs": {
    "aggsName": {
      // 桶聚合 (rid为表号)
      "terms": {
        "field": "rid",
        "size": 1000,
        "collect_mode":"breadth_first"
      },
      "aggs": {
      	// 返回的用户信息,最新用户信息
        "dataResult": {
          "top_hits": {
            "_source": {
              "includes": [
                "userName",
                "userNo",
                "telephone",
                "addressDetail",
                "rid",
                "usage",
                "time"
              ]
            },
            "sort": [
              {
                "time": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        },
        // 查询最近一条记录,时间字段倒序
        //(usageSum中max,min,sum都可以,根据id聚合,只有一条)
        "newResult": {
          "terms": {
            "execution_hint": "map",
            "field": "id",
            "collect_mode":"breadth_first",
            "size": 40000,
            "order": {
              "timeMax": "desc"
            }
          },
          "aggs": {
            "usageSum": {
              "max": {
                "field": "usage"
              }
            },
            "timeMax": {
              "max": {
                "field": "time"
              }
            },
            "bucket_field": {
              "bucket_sort": {
                "sort": [],
                "from": 0,
                "size": 1
              }
            }
          }
        },
        // 同上,查询前5天的数据,时间字段倒序
        "oldResult": {
          "terms": {
            "execution_hint": "map",
            "field": "id",
            "collect_mode":"breadth_first",
            "size": 40000,
            "order": {
              "timeMax": "desc"
            }
          },
          "aggs": {
            "usageSum": {
              "max": {
                "field": "usage"
              }
            },
            "timeMax": {
              "max": {
                "field": "time"
              }
            },
            "bucket_field": {
              "bucket_sort": {
                "sort": [],
                "from": 1,
                "size": 5
              }
            }
          }
        },
        // 取得聚合后的结果
        "newAvg": {
          "avg_bucket": {
            "buckets_path": "newResult>usageSum"
          }
        },
        "oldAvg": {
          "avg_bucket": {
            "buckets_path": "oldResult>usageSum"
          }
        },
        // 条件筛选
        "sales_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "newAvg": "newAvg",
              "oldAvg": "oldAvg"
            },
            "script": "(params.newAvg-params.oldAvg) > 0.5 || (params.oldAvg-params.newAvg) > 0.5"
          }
        },
        // 分页返回
        "bucket_field": {
          "bucket_sort": {
            "sort": [],
            "from": 1,
            "size": 10
          }
        }
      }
    }
  },
  "size": 0
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值