2017-08-16 3 views
0

J'ai essayé de regrouper mon document en heures pour un jour grâce à l'agrégation, mais j'ai toujours obtenu l'exception "nom de champ attendu mais j'ai obtenu [START_OBJECT]"? Quel est le problème?Comment regrouper des documents par heures dans l'agrégation de recherche élastique?

{ 
    "query" : { 
    "bool" : { 
     "must" : { 
     "range" : { 
      "timestamp" : { 
      "from" : "2017-08-14 00:00:00", 
      "to" : "2017-08-15 00:00:00", 
      "include_lower" : true, 
      "include_upper" : true 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "result_by_hours": { 
     "histogram": { 
     "script": "doc.timestamp.date.getHourOfDay()", 
     "interval": 1 
     } 
    } 
    } 
} 

Ce que j'attends est de retourner le nombre de documents pour chaque heure sur hier. Comment puis-je utiliser le temps réel dynamique au lieu de "2017-08-14 - 2017-08-15"?

Merci à l'avance :)

+0

2ème essai a également échoué :( "aggs": { " result_by_hours": { "date_histogram": { "champ": "horodatage", "intervalle": "heure", "format": " k " } } } – Joey

+0

quelle est la version es? – sunkuet02

+0

La version ES est 2.3 – Joey

Répondre

0

Selon la version ES, vous pouvez utiliser le filtre de plage/requête par rapport à « maintenant », ex maintenant 1d/j sera 1 jour dans le temps.

Voir exemples à https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html

En ce qui concerne les aggs vous pouvez également grouper par intervalle, par exemple, une heure à l'aide date_histogram avec un intervalle Dans ES 5.5: Requête:

"range" : { 
      "timestamp" : { 
      "gte" : "now-1d/d, 
      "lte" : "now/d" 
      } 
     } 

Aggs:

{ 
     "aggs" : { 
      "values_over_time" : { 
       "date_histogram" : { 
        "field" : "timestamp", 
        "interval" : "1h" 
       } 
      } 
     } 
    }