如何为 'next 7 days' 进行 ElasticSearch 日期直方图聚合

How to do an ElasticSearch date historgram aggregation for 'next 7 days'

我想在日期字段上使用 ElasticSearch 聚合,其中每个 'bucket' 都是该日期的值。

我是从这个开始的:

"aggs" : {
    "auctions" : {
        "date_histogram" : {
            "field" : "auctionOn",
            "interval" : "day"
        }
    }
}

但是 returns 桶太多了。我只想要接下来 7 天的桶。

我还有一堆其他的聚合,所以过滤器只需要应用到这个聚合。

有什么想法吗?

我也在使用 .NET 的 NEST 客户端,所以如果你能帮我弄清楚如何使用 NEST 客户端,我会很高兴(但我应该能够弄清楚,一旦我有了 ES查询使用)

谢谢

您可以在 filter 聚合中使用 date_histogram 聚合来为特定聚合应用过滤器。

所以聚合看起来像:

{
  "aggs": {
    "filter_hist": {
      "filter": {
        "range": {
          "auctionOn": {
            "gte": "2018-12-01",
            "lte": "2018-12-21"
          }
        }
      },
      "aggs": {
        "hist": {
          "date_histogram": {
            "field": "auctionOn",
            "interval": "1d"
          }
        }
      }
    }
  }
}

您可以根据需要更改 range 过滤器。

执行此操作的方法是对日期字段应用 range 查询,该查询将在计算聚合之前应用。

虽然听起来您在一个请求中执行多个聚合,但此日期范围应仅应用于一个聚合,因此您可以执行 msearch or multi search 以在一个请求中检索多个结果。例如,这就是 Kibana 用于在仪表板中检索多个可视化结果的方法。

类似

public class MyDocument
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime AuctionOn { get; set; }
}

var client = new ElasticClient();

var multiSearchResponse = client.MultiSearch(ms => ms
    .Search<MyDocument>("main_aggs", s => s
        .Aggregations(a => a
            .Terms("titles", t => t
                .Field(f => f.Title)
            )
            .Terms("content", t => t
                .Field(f => f.Content)
            )
        )
    )
    .Search<MyDocument>("date_agg", s => s
        .Query(q => q
            .DateRange(dr => dr
                .Field(f => f.AuctionOn)
                .GreaterThanOrEquals(DateMath.Now)
                .LessThan(DateMath.Now.Add("7d"))
            )
        )
        .Aggregations(a => a
            .DateHistogram("auctions", dh => dh
                .Field(f => f.AuctionOn)
                .Interval(DateInterval.Day)
            )
        )
    )
);

var mainAggsResponse = multiSearchResponse.GetResponse<MyDocument>("main_aggs");

var dateAggResponse = multiSearchResponse.GetResponse<MyDocument>("date_agg");