2017-06-20 35 views
0

我需要返回按照術語分類的數據,然後使用elasticsearch_dsl從ElasticSearch返回日期間隔。 間隔參數化爲,我試圖找出是否有辦法強制ElasticSearch返回上一個完整時間間隔(基於日期範圍)返回用零填充缺失間隔。Elasticsearch日期直方圖聚合 - 如何強制最大(最新發布)完整時間間隔

我已經在使用的聚集和min_doc_count=0extended_bounds.min,而這需要照顧範圍的開始,但無法弄清楚如何指定extended_bounds.max,使得它不會搶最近部分間隔。

下面是相關的代碼位我到目前爲止有:

from_period = (datetime.now() - timedelta(days=lookback_in_days)) 

date_range_max = "now" 
if interval in FULL_INTERVALS: 
    # round down by interval 
    date_range_max += "/" + (interval[:1].upper() if interval == 'month' else interval[:1]) 
else: 
    # round down by time unit 
    temp = re.split(PARTIAL_INTERVAL_PATTERN, interval) 
    ## e.g. for interval = '3d', temp will have ['', '3', 'd', ''] 
    date_range_max += "/" + temp[2] 

s = ES_Search(doc_type='message', index=config['ES_INDEX_NAME']) \ 
    .using(client) \ 
    .query('match', foo=bar) \ 
    .filter('range', 
      **{ 
       "@timestamp": { 
        "gte": from_period, 
        "lt": date_range_max 
       } 
      } 
    ) 

for name in score_names: 
    s.aggs.bucket(name, 'terms', field='meta.{}.value.keyword'.format(name)) 
    s.aggs[name].bucket(
     'interval_buckets', 
     'date_histogram', 
     field='@timestamp', interval=interval, 
     format='YYYY-MM-dd', time_zone=time_zone, 

     # set a "hard" start/end dates to make sure uniform earliest/latest bucket, and include empty buckets 
     min_doc_count=0, 
     extended_bounds={ 
      "min": from_period.strftime("%Y-%m-%d"), 
      "max": datetime.now().strftime("%Y-%m-%d") 
     } 
    ) 

是否有指定extended_bounds.max這樣Elasticsearch會做計算依據filter,或做我必須做的日期的手工計算方式在extended_bounds.max中使用?

回答

0

看起來沒有辦法避免手動計算。

我試着使用一個單獨的查詢,這實際上工作,但讓我意識到,range篩選的上限不適用於倍數的間隔(例如3d,2w等),因爲您只能截取一個單位(例如/ d,/ w等)