当前位置: 首页 > 知识库问答 >
问题:

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

司徒鸿文
2023-03-14

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

我从以下内容开始:

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

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

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

有什么想法吗?

我也在使用NEST客户端。NET,所以如果你能帮我弄清楚如何使用NEST客户端,那就太好了(但我应该能够弄清楚,一旦我有ES查询要使用)

谢谢

共有2个答案

马渊
2023-03-14

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

但是,由于听起来像是在一个请求中执行多个聚合,并且此日期范围应仅应用于一个聚合,因此可以执行msearch或多重搜索以在一个请求中检索多个结果。这就是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");
符国安
2023-03-14

您可以在“筛选”聚合中使用“日期直方图”聚合来为特定聚合应用筛选。

因此,聚合如下所示:

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

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

 类似资料:
  • 问题内容: 我一直在尝试在Elasticsearch中使用日期直方图聚合,并且它以纪元或yy-mm-dd-mm- ss格式返回日期。但是我想要的是获取每周的文档计数,例如星期一,星期二等。我有什么方法可以做到这一点? 问题答案: 您需要采用其他方法。使用脚本,您可以将日期时间转换为星期几。在此值上,如果您应用术语汇总,它应该可以正常工作。 将日期时间值转换为工作日的脚本 查询以获取值 您还可以在此

  • 我在组合嵌套日期字段、date_histogram聚合和范围查询时遇到了一个问题。 我的整个查询如下所示: 它给出以下响应(仅显示聚合): 正如您所看到的,我仍然获取指定范围之外的日期值。更奇怪的是,如果删除查询部分,将得到以下响应: 正如您所看到的,所有桶(除了与范围对应的桶)的doc_count都增加了,这意味着过滤掉了一些值,但不是全部。我已经检查了映射和类型为“date”,这也通过date

  • 版本 使用Elasticsearch 目的 此查询将返回直方图,但将返回所有文档中所有可用日期的桶。它不限制在特定的日期范围内。 我试过什么? 我尝试了很多方法来解决这个问题,但都失败了。*范围筛选器,然后直方图*日期范围聚合,然后直方图桶*使用with,完整日期,和时间戳*在直方图聚合内尝试范围筛选器 任何指导将不胜感激!谢了。

  • 问题内容: 我想检查两个日期是否超过一周,例如,检查两个日期是否有7天, 此时,数据范围应仅在一周之内(7天)。 我已经尝试过这样的事情, 有人可以帮忙吗? 问题答案: 最简单的方法是使用Jodatime并使用 另一个解决方案是使用日历,添加7天,然后再次进行比较。

  • 问题内容: 我正在尝试Nest插件来查询elasticsearch数据。我有一个基于领域的年度工作计数报告。目前,我为此使用了日期直方图报告,下面是弹性查询。 等效嵌套查询 一切正常,但是现在问题是遍历结果以获取值,对于正常的聚合,我目前正在执行以下操作 但似乎Nest不支持带有日期直方图存储桶的存储桶。 如果我尝试如下所示,我将得到null引用异常。 看来我们必须使用如下所示的方法。d2现在具有

  • 问题内容: 我正在使用PHPMyadmin,并使用PHP将值放入数据库中。我使用时间戳存储产品的到期日期,如下所示,例如: 我要选择所有到期日期等于今天的日期加上8天的日期(例如上面的那一天) 我也想在一个单独的页面中选择所有过期日期等于今天日期+ 2周的内容,如果有人可以帮助我,将不胜感激! 问题答案: 您可以使用以下查询来做到这一点: 您可以使用过去的日期。