2015-10-15 98 views
3

我在Elasticsearch中處理的文檔具有持續時間的概念,表示爲開始和結束時間,例如,Elasticsearch在一段時間內的日期直方圖聚合

{ 
    issueId: 1, 
    issuePriority: 3, 
    timeWindow: { 
    start: "2015-10-14T17:00:00-07:00", 
    end: "2015-10-14T18:00:00-07:00" 
    } 
}, 
{ 
    issueId: 2, 
    issuePriority: 1, 
    timeWindow: { 
    start: "2015-10-14T16:50:00-07:00", 
    end: "2015-10-14T17:50:00-07:00" 
    } 
} 

我的目標是生成一個直方圖,其中問題數量及其最大優先級彙總爲15分鐘的桶。因此,對於上面的示例,issue #1將被分爲17:00,17:15,17:3017:45桶,不多不少。

我嘗試使用date_histogram聚集,e.g:

aggs: { 
    max_priority_over_time: { 
    date_histogram: { 
     field: "timeWindow.start", 
     interval: "15minute", 
    }, 
    aggs: { 
     max_priority: ${top_hits_aggregation} 
    } 
    } 
} 

但顯然它只是bucketizing issue #117:00桶。即使我考慮到timeWindow.end,它也只會被添加到18:00存儲桶中。有誰知道我如何使用date_histogram或其他Elasticsearch聚合來完成此操作?從timeWindow.starttimeWindow.end可能會產生一個時間範圍15分鐘的時間範圍,以便它們可以正確bucketized。謝謝。

回答

0

根據定義,分段操作會將您的查詢返回的每個對象放入一個桶中,也就是說,您不能在一次查詢中同時將同一對象放入多個桶中。

如果我正確理解您的問題,那麼您需要執行一系列查詢,應用range filter來獲取每個15分鐘間隔中的問題數。因此,對於由您定義每個間隔,你會得到的是該區間內是開放的問題:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         "range": { 
          "timeWindow.start" : { 
           "lte" : "2015-10-14T17:00:00-07:00" 
          } 
         }, 
         "range": { 
          "timeWindow.end" : { 
           "gte" : "2015-10-14T17:15:00-07:00" 
          } 
         }, 
        ] 
       } 
      } 
     } 
    } 
} 

(你需要你的max_priority聚集添加到查詢)。

範圍查詢將被elasticsearch緩存,所以這應該是相當有效的。假設您的歷史數據不會改變,您也可以在應用程序中緩存歷史時間間隔的結果。

+0

感謝您的回答,但問題在於我需要在代碼中動態生成所有可能的15分鐘範圍。而且我不知道我的數據的時間範圍會是什麼。如果我需要查詢說1周的持續時間,那麼範圍的數量是巨大的!我想知道是否有其他解決方案。 –

1

您需要爲此使用腳本。創建一個發出日期數組的腳本。這些日期應該從開始日期開始,每個日期應增加15分鐘(假設15分鐘是間隔)。現在將這個腳本放在date_histogram的腳本選項中。 所以基本上腳本應做到以下幾點 -

start=2015-10-14T17:00:00-07:00 
end=2015-10-14T18:00:00-07:00" 
Output of script = [ "2015-10-14T17:00:00-07:00" , "2015-10-14T17:15:00-07:00" , "2015-10-14T17:30:00-07:00" , "2015-10-14T17:45:00-07:00" , "2015-10-14T18:00:00-07:00" ] 

要瘦更對腳本,你可以通過這個Elasticsearch documentations。這些博客可能也有用 - This,thisthis

+1

感謝您的回答,您能否指出我的一些文檔展示瞭如何完成這種動態字段生成?它適用於'date_histogram'聚合? –

+0

我在答案中添加了一些指針,如果我有一些時間,我會嘗試製作腳本。 –

+0

@VineethMohan你有沒有得到這個腳本的工作? –

1

好了,因爲我的數據的時間戳總是截斷至最接近的10分鐘,我想我可以用一個nested terms aggregation代替:

aggs: { 
    per_start_time: { 
    terms: { 
     field: "timeWindow.start" 
    }, 
    aggs: { 
     per_end_time: { 
     terms: { 
      field: "timeWindow.end" 
     }, 
     aggs: { 
      max_priority: ${top_hits_aggregation} 
     } 
     } 
    } 
    } 
} 

這給了我每END_TIME每START_TIME嵌套桶,即G:

{ 
    "key": 1444867800000, 
    "key_as_string": "2015-10-15T00:10:00.000Z", 
    "doc_count": 11, 
    "per_end_time": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
     "key": 1444871400000, 
     "key_as_string": "2015-10-15T01:10:00.000Z", 
     "doc_count": 11, 
     "max_priority": { 
      "hits": { 
      "total": 11, 
      "max_score": 4, 
      } 
     } 
     } 
    ] 
    } 
} 

在我們的後端修剪下來的水桶(Ruby on Rails的),我能得到以下結果:

[ 
    { 
    "start_time": "2015-10-14 14:40:00 -0700", 
    "end_time": "2015-10-14 15:40:00 -0700", 
    "max_priority": 4, 
    "count": 12 
    } 
], 
[ 
    { 
    "start_time": "2015-10-14 14:50:00 -0700", 
    "end_time": "2015-10-14 15:50:00 -0700", 
    "max_priority": 4, 
    "count": 12 
    } 
], 
... 

可以是地圖/進一步降低爲日期直方圖任意時間桶,當然不包括彈性搜索。如果timeWindow.start,和窗口持續時間在時間​​上完全是任意的,那麼我想它相當於只讀取所有內容並在後端進行計數(因爲它幾乎爲每個文檔生成一個嵌套時間段),幸運的是我處理的時間戳有些可預測,所以我可以採取這種混合方法。

相關問題