当前位置: 首页 > 面试题库 >

ElasticSearch的年和每周汇总

阳文轩
2023-03-14
问题内容

我每年进行一次嵌套聚合,然后每年在Elasticsearch中进行每周一次嵌套聚合。years年有53周,但是ElasticSearch的结果给出的是year年的最后一周key
=“ 1”而不是“ 53”。如何让ElasticSearch在上周返回53而不是1?

这是我的查询:

GET _search
    {
  "size": 0,
  "aggs": {
    "activities_per_year": {
      "date_histogram": {
        "field": "start",
        "interval": "1y",
        "format": "yyyy"
      },
      "aggs": {
        "activities_per_week": {
          "date_histogram": {
            "field": "start",
            "interval": "week",
            "format": "w"
          }
        }
      }
    }
  }
}

结果(删除的数据在中间):

"key_as_string": "2008",
           "key": 1199145600000,
           "doc_count": 872,
           "activities_per_week": {
              "buckets": [
                 {
                    "key_as_string": "1",
                    "key": 1199059200000,
                    "doc_count": 6
                 },
                 {
                    "key_as_string": "2",
                    "key": 1199664000000,
                    "doc_count": 5
                 },
                 {
                    "key_as_string": "3",
                    "key": 1200268800000,
                    "doc_count": 15
                 },       {
                    "key_as_string": "51",
                    "key": 1229299200000,
                    "doc_count": 18
                 },
                 {
                    "key_as_string": "52",
                    "key": 1229904000000,
                    "doc_count": 7
                 },
                 {
                    "key_as_string": "1",
                    "key": 1230508800000,
                    "doc_count": 1
                 }
              ]

2008年是a年,最后一个星期有“ key_as_string”:“ 1”。我希望它是53,所以可以将其添加到字典中:)我该怎么做?

另外,elasticsearch会返回两周的“ key_as_string”:“ 1”表示2013年,我认为2013年不是a年吗?


问题答案:

这有一些细微的陷阱,您需要意识到。首先,Elasticsearch使用Joda Time API来处理与日期时间相关的内容。

其次,来看看这个的“周”究竟是怎样的解释:

以星期为基础的年份是将日期表示为星期几,星期数和年份(以星期为基础)的一年。以下描述是此库中此方法的实现所使用的ISO8601标准。

每周从1到52-53。将一周的第一天定义为星期一,并赋予其值1。

一年的第一周定义为一年中至少有四天的第一周。由于此定义,第1周可能会延续到上一年,而第52/53周可能会延续到下一年。因此,需要周年字段。

例如,2003-01-01是星期三。这意味着2003年是该周的五天,从周三到周日。因此,整周被认为是2003年的第一周。由于所有周从星期一开始,因此2003年的第一周从2002年12月30日开始,即。在2002年。

基于星期的年份具有特定的文本格式。2002-12-30(2002年12月30日星期一)将表示为2003-W01-1。2003-01-01(2003年1月1日,星期三)将表示为2003-W01-3。

因此,在您的情况下,您会看到2008年12月29日属于第一周,因为2008年12月29日所在的一周是2008年的三天和2009年的四天。根据上述规则,这是从2009年。这与leap年无关。举一个例子,尝试索引31-12-2009和31-12-2015。两者都会给您第53周的时间,而且它们都不是leap年。

为了更好地了解这些内容,我建议您采用以下格式进行汇总"format": "x-w---yyyy-MM-dd"

{
  "size": 0,
  "aggs": {
    "activities_per_year": {
      "date_histogram": {
        "field": "start",
        "interval": "1y",
        "format": "yyyy"
      },
      "aggs": {
        "activities_per_week": {
          "date_histogram": {
            "field": "start",
            "interval": "week",
            "format": "x-w---yyyy-MM-dd"
          }
        }
      }
    }
  }
}


 类似资料:
  • 问题内容: 我想按周总结sales.quantity的总和,即使没有销售,也要显示周数。 我已经在其中设置了带有1-54的周表,以使用外部联接强制所有周数都通过,但是它不起作用。它错过了没有销售的几周。 我的查询是: 任何帮助都会得到很大的帮助……这可能是我做的愚蠢的事情! 问题答案: where子句将删除所有没有销售的星期。您可能需要执行子查询以拉动交易,然后将其加入周表。

  • 我如何在AWS上每周日和周三凌晨2点UTC运行cron作业。 时间很好,只是天数似乎是错误的格式(通过无服务器获取)。但是我能找到的所有资源都只做状态范围的天数,如何选择单个资源?

  • 我希望有办法解决这个问题,因为关于pyplot中的xtick格式有很多问题,但我没有发现任何与这个问题相关的东西。 我有以下代码: 它工作得很好,但是输出有点混乱,因为这是每周的数据。 一些样本数据: 输出: xticks标签是不可读的,我想知道是否有人知道如何拥有相同的每周图表,但xticks只代表一年。我尝试了几种不同的方法,但是要么(1)它将图形缩小到屏幕的最左边,要么(2)我得到一个错误,

  • 本文向大家介绍PHP计算一年多少个星期和每周的开始和结束日期,包括了PHP计算一年多少个星期和每周的开始和结束日期的使用技巧和注意事项,需要的朋友参考一下 项目中需要做个提交周报的功能,需要知道指定周数的开始日期和结束日期,以便处理其他业务。以下是一段通过PHP来获取一年中的每星期的开始日期和结束日期的代码,与大家分享。 函数get_week()通过传入参数$year年份,获取当年第一天和最后一天

  • 我有一个名为-'users'的示例sql表,其中包含以下记录: 我想获得每一个用户的计数在每日,每周和每月的基础上与预期的outlike为:

  • 我有一个时间序列,列出了几个月交易历史中期货合约的成交价格数据。我希望有一个图表(折线图),显示时间序列中最近4周内每周滴答数据的交易历史(该序列不断更新) X轴将显示周一至周五的日期,图表上任何时候都会有4条单独的线详细说明刻度数据。我已经设法做到这一点,使用一些代码,绘制最后一笔交易的每一天,但我需要的是滴答数据绘图,而不是仅仅一个数据点,每天为每一行。 这是一张Excel图表(!)在我试图用