2017-06-20 1 views
0

Je dois retourner les données mises en évidence par terme, puis par un intervalle de date d'ElasticSearch en utilisant elasticsearch_dsl. L'intervalle est paramétré, et j'essaie de déterminer s'il existe un moyen de forcer ElasticSearch à retourner au dernier intervalle complet (basé sur une plage de dates) en remplissant les intervalles manquants avec des zéros.Elasticsearch Date Histogramme Agrégation - Comment forcer max (le plus renvoyé) plein intervalle

J'utilise déjà min_doc_count=0 et extended_bounds.min dans l'agrégation, et qui se charge du début de la plage, mais ne peut pas comprendre comment spécifier extended_bounds.max de telle sorte qu'il ne saisit pas le plus récent intervalle partiel.

est ici peu pertinent de code que j'ai jusqu'à présent:

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") 
     } 
    ) 

Y at-il un moyen de spécifier extended_bounds.max telle que Elasticsearch fera le calcul basé sur filter, ou dois-je faire le calcul manuel de la date utiliser dans extended_bounds.max?

Répondre

0

Il semble qu'il n'y ait aucun moyen d'éviter le calcul manuel. J'ai essayé d'utiliser une requête séparée, qui a effectivement fonctionné, mais je me suis rendu compte que la limite supérieure du filtrage range ne fonctionne pas pour les intervalles qui sont multiples (par exemple 3d, 2w, etc.) puisque vous ne pouvez que tronquer d'un unité (par exemple/d,/w, etc.)