2014-11-02 55 views
4

我的文檔的結構是這樣的:Elasticsearch日期範圍聚集在多個領域

{ 
    "element": "A", 
    "date": "2014-01-01", 
    "valid_until": "2014-02-01" 
}, 
{ 
    "element": "A", 
    "date": "2014-02-01", 
    "valid_until": "9999-12-31" 
} 

日期‘9999-12-31’是在這裏說:‘還沒有到期’。總是有這樣的範圍,所以對於給定的元素「A」,date> valid_until永遠不會重疊。因此,我可以指望我有多元素必須使用僞代碼:COUNT元素,其中日期< date_to_count和valid_until> = date_to_count

其中「date_to_count」是,我要算值的日期。因爲我想在幾個時間點計算這個值,所以我可以使用日期直方圖或日期範圍聚合。但是,日期範圍確實似乎只適用於一種領域。理想情況下,我希望能夠做到這一點:

"aggs": { 
    "foo": { 
     "date_range": { 
      "fields": ["date", "valid_until"], 
      "ranges": [ 
       {"from": "2014-01-01", "to": {"2014-02-01"}}, 
       {"from": "2014-02-01", "to": {"2014-03-01"}}, 
       {"from": "2014-03-01", "to": {"2014-04-01"}} 
      ] 
     } 
    } 
} 

當「日期」將被用於「從」,以及「valid_until」將用於「到」。

我已經嘗試了幾個其他的想法與腳本,但無法找到一種有效的方式來做到這一點:/。

我想我也可以解決這個問題,如果在腳本中,我可以訪問當前值/值,但是我再次嘗試過「ctx.to」,「context.to」 ,但這些變量是未定義的。

謝謝!

回答

0

由於date_rangedate_histogram聚合在一個字段上工作,我認爲您不能通過聚合實現您的目標。但是,如果您沒有太多需要查詢的日期範圍,則可以通過查詢每個日期範圍來調用count API。這看起來像這樣:

"query": { 
    "filtered": { 
    "filter": { 
     "bool" { 
     "must": [ 
      { "range": { "date": { "gte": "2014-01-01" }}}, 
      { "range": { "valid_until": { "lt": "2014-02-01" }}} 
     ] 
     } 
    } 
    } 
} 
0

我正面臨同樣的問題,並希望通過使用一個單一的查詢來解決這個問題。這裏是在Elasticsearch 5.2中爲我工作的解決方案。

"aggs": { 
    "range1": { 
     "date_range": { 
      "fields": "date", 
      "ranges": [ 
       {"from": "2014-01-01", "to": {"2014-02-01"}}, 
       {"from": "2014-02-01", "to": {"2014-03-01"}}, 
       {"from": "2014-03-01", "to": {"2014-04-01"}} 
      ] 
     }, 
    "range2": { 
     "date_range": { 
      "field": "valid_until", 
      "ranges": [ 
       {"from": "2014-01-01", "to": {"2014-02-01"}}, 
       {"from": "2014-02-01", "to": {"2014-03-01"}}, 
       {"from": "2014-03-01", "to": {"2014-04-01"}} 
      ] 
     } 
    } 
}