【问题标题】:How to do an ElasticSearch date historgram aggregation for 'next 7 days'如何对“未来 7 天”进行 ElasticSearch 日期直方图聚合
【发布时间】:2018-12-21 01:09:48
【问题描述】:

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

我是从这个开始的:

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

但是它返回了太多的桶。我只想要接下来 7 天的存储桶。

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

有什么想法吗?

我也在使用 .NET 的 NEST 客户端,所以如果你能帮助我弄清楚如何使用 NEST 客户端,那么我应该能够弄清楚,一旦我有 ES 查询使用)

谢谢

【问题讨论】:

  • 在过滤聚合中使用直方图聚合。
  • @Nishant Saini 你能用一些示例代码回答一下吗?

标签: elasticsearch nest


【解决方案1】:

您可以在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 过滤器。

【讨论】:

  • Nishant 或@RussCam 任何想法如何将其移植到 NEST 客户端?我看不到如何将过滤器应用于聚合(仅应用于主查询)
  • 我无法在 NEST 方面为您提供帮助。 @RussCam 可以。
  • 这可能会有所帮助:Filter Aggregation: NEST
  • 啊.. 很酷,不知道我怎么没找到(有时文档很难导航:))我应该能够弄清楚.. 非常感谢!
【解决方案2】:

执行此操作的方法是对日期字段应用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");

【讨论】:

  • 太棒了,谢谢拉斯。这是否意味着 Nishants 的答案不正确,因为过滤器将应用于其他聚合?
  • @RPM1984 不,过滤器聚合仅适用于嵌套在其下方的聚合。这是解决问题的另一种方法
  • 有趣。两种解决方案有什么区别?下面一个似乎在一次往返中完成? (我知道这并不总是一件好事)
  • 他们都在一次往返中完成。 Nishant 的解决方案在您只想将过滤器应用于聚合的情况下很有用,例如您可能还会返回文档,但希望显示应用了过滤器的构面。此解决方案允许您在一个请求中返回多个搜索
  • 老实说,我不确定哪个会更快。可能想用您的数据对两者进行基准测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多