代码之家  ›  专栏  ›  技术社区  ›  RPM1984

如何为“未来7天”进行ElasticSearch日期直方图聚合

  •  0
  • RPM1984  · 技术社区  · 7 年前

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

    我从这个开始:

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

    但它返回的桶太多了。在接下来的7天里我只想要水桶。

    我还有一堆其他聚合,因此过滤器只需应用于 聚合。

    有什么想法吗?

    我也在使用用于.NET的NEST客户端,因此如果您能帮助我了解如何使用NEST客户端,那就有额外的好处了(但一旦我有了ES查询,我应该能够了解它)

    2 回复  |  直到 7 年前
        1
  •  2
  •   Nishant    7 年前

    你可以用 date_histogram 聚集在 filter 聚合为特定聚合应用筛选器。

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

    你可以换个房间 range 根据您的需要进行过滤。

        2
  •  1
  •   Russ Cam    7 年前

    实现这一点的方法是应用 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");