首页 > 解决方案 > Elasticsearch:按时间范围分组

问题描述

我进行了此查询以获取用户在上个月(或一天)与其他用户相比的请求数。

{
"query": {
    "bool": {
        "must": [
            {
                "range": {
                    "created": {
                        "gte": 1554854400000
                    }
                }
            }
        ]
    }
},
"aggs": {
    "requests": {
        "filters": {
            "other_bucket_key": "all",
            "filters": {
                "user": {
                    "match": {
                        "user_id": "XXXXXX"
                    }
                }
            }
        }
    }
}
}

这些是在选定时间段内提出的所有请求。
现在,我想获取用户在上个月与其他用户相比的请求数/天数。
我能够使用 Date Histogram Aggregation 来获得这个请求的总数,但我不知道如何将它分成用户和其余部分。
我不知道这是否可能,或者也许有另一种方法可以做到这一点。

标签: elasticsearchelasticsearch-aggregation

解决方案


您走在正确的道路上,您只需将date_histogram每日聚合和您已经拥有的过滤器聚合结合起来:

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "created": {
              "gte": 1554854400000
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "per_day": {
      "date_histogram": {
        "field": "created",
        "interval": "day"
      },
      "aggs": {
        "requests": {
          "filters": {
            "other_bucket_key": "all",
            "filters": {
              "user": {
                "match": {
                  "user_id": "XXXXXX"
                }
              }
            }
          }
        }
      }
    }
  }
}

对于每一天,您将获得用户发出的请求数与所有其他用户的请求数。


推荐阅读