2014-10-31 81 views
1

我正在做一個嵌套聚合,每年,然後每年在elasticsearch中每週進行一次。閏年有53周,但ElasticSearch的結果給出閏年key =「1」而非「53」的最後一週。如何使ElasticSearch在上週返回53而不是1?ElasticSearch中每週的閏年和聚合

這裏是我的查詢:

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在2013年返回「key_as_string」:「1」兩週,我不認爲2013是閏年?

回答

1

這有一些需要注意的細微陷阱。首先,Elasticsearch使用Joda Time API作爲日期時間相關的東西。

其次,看看一個什麼樣的「周」,實際上是this解釋:

一個星期基於今年是一個地方的日期表示爲一週的某一天, 週數和年(周基於)。以下描述是 庫中此方法的實現使用的ISO8601標準。

周以一週爲基準,從1到52-53。 星期的第一天定義爲星期一,並給出值1.

一年的第一週定義爲在該年至少四天的第一週,該日期爲 。由於這一定義,第1周 可能會延續到前一年,第52/53周可能會延續到下一年的 。因此需要週年的一年。

例如,2003-01-01是星期三。這意味着當週的週五到週日的五天 在2003年。因此整個星期是 被認爲是2003年的第一週。由於所有周從 開始星期一,2003年的第一週開始於2002年 - 12-30,即。

以周爲單位的年份有特定的文本格式。 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天的一週內。根據上述規則,這是2009年的第一週。而這與閏年無關。舉個例子,嘗試索引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" 
      } 
     } 
     } 
    } 
    } 
} 
+0

謝謝你:-) 一個很好的解釋,但爲什麼不Elasticsearch從2009年當「過濾掉」日期我的第一個聚合有間隔:1y?我認爲我的子聚合「activities_per_week」是從與「activities_per_year」聚合相匹配的文檔輸入的? – Thomas 2014-11-04 14:01:00

+0

這是個好問題,我現在沒有答案。 – 2014-11-04 16:03:37