代码之家  ›  专栏  ›  技术社区  ›  Jai Sharma

在elasticsearch中的样本处拾取数据集

  •  0
  • Jai Sharma  · 技术社区  · 8 年前

    我有一个数据集,比如说1000个日期跨越一个月。我想基于这个日期字段进行聚合,但只对间隔(例如,周)分隔的几个样本进行聚合。

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

    我抬头看着 采样器 聚合,并且需要提供脚本。我不知道该如何编写脚本,以获取样本并将这些样本提供给子聚合。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Val    8 年前

    有不同的方法可以做到这一点。其中之一是使用 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" } 
                    ]
                }
            }
        }
    }