在elasticsearch

时间:2017-02-01 04:42:24

标签: elasticsearch elasticsearch-aggregation

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

例如:对于1分至30分钟的日期,我应该获得日期:1月12日,8月12日,15日结束,22日结束时29月12日 PS:我不想在这里使用日期直方图,因为它分组数据到给定的间隔。因此,对于上面的例子,它形成了1-7,8-15之类的桶等等。

我查看了 sampler 聚合,它需要提供一个脚本。我无法弄清楚如何编写脚本以获取样本并将这些样本提供给子聚合。

1 个答案:

答案 0 :(得分:0)

有不同的方法可以做到这一点。其中之一是使用由过滤器约束的date_histogram聚合,该过滤器仅选择所需的日期:

{
  "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"
          }
        }
      }
    }
  }
}

第二种方式更简洁,归结为只使用选定日期的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" } 
                ]
            }
        }
    }
}