在弹性搜索中的样本中选择数据集

Pick dataset at samples in elasticsearch

我有一个数据集,其中包含跨越 1 个月的 1000 个日期。我想根据这个日期字段进行聚合,但只有几个样本由一个间隔(比如周)分隔。

例如:对于从 12 月 1 日到 30 日不等的日期,我应该获取以下日期的存储桶:12 月 1 日、12 月 8 日、12 月 15 日、12 月 22 日和 12 月 29 日。 PS :我不想在这里使用日期直方图,因为它 groups 数据到给定的间隔。因此,对于上面的示例,它从 1-7、8-15 等形成桶。

我查看了 sampler 聚合,它需要提供脚本。我不知道应该如何编写脚本来获取样本并将这些样本提供给子聚合。

有多种方法可以做到这一点。其中之一是使用 date_histogram 受过滤器约束的聚合,该过滤器只会 select 所需的日期:

{
  "aggs": {
    "5_days": {
      "filter": {
        "filter": {
          "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "range": {
                  "date": {
                    "from": "2016-12-01T00:00:00.000Z",
                    "to": "2016-12-02T00:00:00.000Z"
                  }
                }
              },
              {
                "range": {
                  "date": {
                    "from": "2016-12-08T00:00:00.000Z",
                    "to": "2016-12-09T00:00:00.000Z"
                  }
                }
              },
              {
                "range": {
                  "date": {
                    "from": "2016-12-15T00:00:00.000Z",
                    "to": "2016-12-16T00:00:00.000Z"
                  }
                }
              },
              {
                "range": {
                  "date": {
                    "from": "2016-12-22T00:00:00.000Z",
                    "to": "2016-12-23T00:00:00.000Z"
                  }
                }
              },
              {
                "range": {
                  "date": {
                    "from": "2016-12-29T00:00:00.000Z",
                    "to": "2016-12-30T00:00:00.000Z"
                  }
                }
              }
            ]
          }
        }
      },
      "aggs": {
        "samples": {
          "date_histogram": {
            "field": "date",
            "interval": "day"
          }
        }
      }
    }
  }
}

第二种方法更简洁,归结为使用仅包含 selected 日期的 date_range aggregation

{
    "aggs": {
        "range": {
            "date_range": {
                "field": "date",
                "ranges": [
                    { "from": "2016-12-01T00:00:00.000Z", "to": "2016-12-02T00:00:00.000Z" }, 
                    { "from": "2016-12-08T00:00:00.000Z", "to": "2016-12-09T00:00:00.000Z" }, 
                    { "from": "2016-12-15T00:00:00.000Z", "to": "2016-12-16T00:00:00.000Z" }, 
                    { "from": "2016-12-22T00:00:00.000Z", "to": "2016-12-23T00:00:00.000Z" }, 
                    { "from": "2016-12-29T00:00:00.000Z", "to": "2016-12-30T00:00:00.000Z" } 
                ]
            }
        }
    }
}