ElasticSearch中每周的闰年和聚合

时间:2014-10-31 09:30:12

标签: elasticsearch

我每年都会进行嵌套聚合,然后每年进行一次弹性搜索。闰年有53周,但ElasticSearch的结果给出了闰年的最后一周关键=" 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是闰年,上周有" key_as_string":" 1"。我希望这个是53,所以我可以将它添加到我的词典中:)我该怎么做?

此外,elasticsearch使用" key_as_string":" 1"返回两周。对于2013年,我不认为2013年是闰年?

1 个答案:

答案 0 :(得分:1)

这有一些需要注意的微妙问题。首先,Elasticsearch使用Joda Time API作为日期时间相关的东西。

其次,看看this解释实际上是什么"周":

  

基于星期的年份是将日期表示为星期几的日期,   周数和年(基于周)。以下描述是   此方法的实现所使用的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。

因此,在您的情况下,您看到29-12-2008属于第1周,因为2008年12月29日是一周,2008年为3天,2009年为4天。根据上述规则,&# 39;从2009年开始的第1周。这与闰年无关。举个例子,尝试索引31-12-2009和31-12-2015。两者都会给你53周,而且它们不是闰年。

为了更好地了解这些内容,我建议您使用以下格式进行汇总:"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"
          }
        }
      }
    }
  }
}