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

fruv7luv  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(559)

我想在日期字段上使用elasticsearch聚合,其中每个“bucket”都是该日期的值。
我从这个开始:

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

但它返回的桶太多了。我只想要未来7天的水桶。
我还有一堆其他的聚合,所以过滤器只需要应用于这个聚合。
有什么想法吗?
我也在使用nest client for.net,所以如果你能帮我弄清楚如何使用nest client,那就有好处了(但是我应该能够弄清楚,一旦我有了es查询就可以使用了)
谢谢

hlswsv35

hlswsv351#

方法是应用 range 查询日期字段,该字段将在计算聚合之前应用。
但是,由于听起来像是在一个请求中执行多个聚合,并且此日期范围应仅应用于一个聚合,因此可以执行 msearch 或多搜索以在一个请求中检索多个结果。这就是kibana用来检索 Jmeter 板中多个可视化结果的例子。
像这样的

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");
sshcrbum

sshcrbum2#

你可以用 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 根据需要过滤。

相关问题