Les agrégations avec Elasticsearch

Elasticsearch-Logo-Color-V.jpg

Tout d’abord quelques mots sur Elasticsearch pour la culture. Elasticsearch est basé sur la bibliothèque Apache Lucene. Il fournit tout le nécessaire à l’indexation de documents et à l’exécution des requêtes de recherches.
Elasticsearch facilite l’utilisation de Lucene en intégrant la bibliothèque dans une application Java modulaire, facilement configurable et capable de fonctionner en cluster.
Elasticsearch  utilise une base de données NoSQL, codée au format JSON, qu’il indexe et interroge via une API rest. Cela permet donc de créer facilement et rapidement un moteur de recherche intelligent que l’on pourrait qualifier « à la Google ».

En plus d’offrir des fonctionnalités de recherche avancées, Elasticsearch permet également de faire des agrégations sur vos données, c’est à dire effectuer des calculs sur vos données indexées pour par exemple faire un top 5 par catégorie avec le total correspondant, faire une répartition par date, faire une répartition par volume… Nous allons immédiatement voir tout ceci d’un peu plus près.

Avant de commencer

Installation

On va tout d’abord installer tout ce dont nous avons besoin, pour cela assurez vous d’avoir un JDK 7 minimum d’installé et la variable JAVA_HOME de configurée.

Ensuite vous devez télécharger les binaires pour Elasticsearch et Logstash, ce dernier nous permettra d’envoyer nos données dans Elasticsearch pour l’indexation. Pour Logstash si vous n’avez pas JRuby d’installé sur votre poste il vous le faudra également.

Les installations d’Elasticsearch et Logstash sont très simples car il vous suffit de décompresser les archives. Pour faciliter la saisie des requêtes Elasticsearch, je vous conseille d’installer une extension pour Chrome qui s’appelle Sense.

Indexation des données

Le jeu de données qui sera utilisé dans cet article provient des données en libre utilisation de la ville de New York sur les informations concernant les accidents de circulation. Téléchargez le fichier à cette adresse https://data.cityofnewyork.us/api/views/h9gi-nx95/rows.csv?accessType=DOWNLOAD, il s’agit d’un fichier CSV qui fait la bagatelle de 135Mo.

Une fois le fichier CSV téléchargé, déplacez ce dernier dans le répertoire « bin » de votre installation Logstash de même que ce fichier nyc_collision_logstash. Ouvrez une fenêtre de commande à l’emplacement du dossier bin puis exécutez la commande suivante :

cat nyc_collision_data.csv | logstash -f nyc_collision_logstash.conf

Et maintenant vous pouvez prendre un café car il faut compter une dizaine de minutes pour indexer l’intégralité du fichier CSV. Quand l’indexation est terminée, la commande s’arrête d’elle même. Pour vérifier que tout s’est bien passé, vous pouvez dans Sense lancer cette requête :

GET /nyc_visionzero/_count

Vous devriez avoir en résultat quelque chose comme cela :

{
   "count": 735858,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   }
}

qui nous indique que notre index « nyc_visionzero » contient 735858 documents.

Agrégeons!

Agrégation « bucket »

Les agrégations de type « bucket » sont des agrégations renvoyant plusieurs résultats, lesquels sont répartis dans un tableau de valeurs en fonction des critères définis dans la requête.

Agrégation simple

Le premier exemple d’agrégation va nous retourner le nombre d’incidents répertoriés par arrondissement :

GET /nyc_visionzero/_search?search_type=count
{
 "aggs" : {
  "all_boroughs": {
   "terms": {
    "field": "borough"
   }
  }
 }
}

On voit que notre agrégation est une recherche, « _search« , que nous typons pour obtenir uniquement les résultats de l’agrégation, « search_type=count". Le corps de notre requête commence par le mot clé « aggs« , c’est ce qui définit le début de notre agrégation. Le terme « all_boroughs" correspond au nom que nous donnons à notre agrégation. Et enfin nous indiquons que notre agrégation est faite par rapport au champ « borough« .

Ce qui donne comme résultat :

{
   "took": 109,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "all_boroughs": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "BROOKLYN",
               "doc_count": 170884
            },
            {
               "key": "MANHATTAN",
               "doc_count": 147516
            },
            {
               "key": "QUEENS",
               "doc_count": 143586
            },
            {
               "key": "BRONX",
               "doc_count": 71048
            },
            {
               "key": "STATEN ISLAND",
               "doc_count": 26401
            }
         ]
      }
   }
}

On retrouve le nom de notre agrégation « all_boroughs » et la répartition des résultats par arrondissement est restituée dans le tableau « buckets » dans lequel on voit pour chaque arrondissement le nombre d’incidents enregistrés.

Agrégation type « histogram »

Parmi la multitude d’agrégations disponibles, il y a des agrégations permettant d’avoir les résultats répartis suivant un intervalle donné, par exemple une répartition par mois ou une répartition par tranche de valeur.

Exemple d’une répartition par mois :

GET nyc_visionzero/_search?search_type=count
{
 "aggs" : {
  "months": {
   "date_histogram": {
    "field": "@timestamp",
    "interval": "month"
   }
  }
 }
}

Dans ce cas tous les incidents de circulation vont être répartis par mois ce qui donne comme résultat :

{
   "took": 30,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "months": {
         "buckets": [
            {
               "key_as_string": "2012-06-01T00:00:00.000Z",
               "key": 1338508800000,
               "doc_count": 34
            },
            {
               "key_as_string": "2012-07-01T00:00:00.000Z",
               "key": 1341100800000,
               "doc_count": 16968
            },
            {
               "key_as_string": "2012-08-01T00:00:00.000Z",
               "key": 1343779200000,
               "doc_count": 17171
            },
            {
               "key_as_string": "2012-09-01T00:00:00.000Z",
               "key": 1346457600000,
               "doc_count": 16498
            }
...
  ]
 }
 }
}

On voit bien dans notre tableau « buckets » que chaque entrée correspond à un mois dont la valeur est retournée à la fois sous forme de chaîne de caractères mais aussi son timestamp.

Exemple de répartition par valeur :

Ici nous recherchons les incidents en fonction du nombre de personnes blessées et nous demandons à répartir par tranche de 10

GET nyc_visionzero/_search?search_type=count
{
 "aggs" : {
  "injuries": {
   "histogram": {
    "field": "number_of_persons_injured",
    "interval": 10
   }
  }
 }
}

Le résultat :

{
   "took": 14,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "injuries": {
         "buckets": [
            {
               "key": 0,
               "doc_count": 735766
            },
            {
               "key": 10,
               "doc_count": 83
            },
            {
               "key": 20,
               "doc_count": 5
            },
            {
               "key": 30,
               "doc_count": 1
            },
            {
               "key": 40,
               "doc_count": 1
            }
         ]
      }
   }
}

Comme vous pouvez le voir, ce type d’agrégation se prête parfaitement à l’alimentation d’un graphique où l’on reçoit directement les données à afficher.

Agrégation par tranche

L’agrégation par tranche, « range« , permet d’obtenir le nombre d’incidents en bornant  la recherche avec une valeur minimum et / ou une valeur maximum.

Exemple de recherche avec un range de type numérique

GET nyc_visionzero/_search?search_type=count
{
    "aggs" : {
        "hour_ranges" : {
            "range" : {
                "field" : "hour_of_day",
                "ranges" : [
                    { "to" : 9 },
                    { "from" : 0, "to" : 23 },
                    { "from" : 11, "to" : 14 },
                    { "from" : 20 }
                ]
            }
        }
    }
}

On recherche ici les incidents par tranche horaire :

  1. Jusqu’à 9 heure du matin
  2. De 0 à 23h
  3. De 11 à 14h
  4. Après 20h

Résultat :

{
   "took": 34,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "hour_ranges": {
         "buckets": [
            {
               "key": "*-9.0",
               "to": 9,
               "to_as_string": "9.0",
               "doc_count": 137521
            },
            {
               "key": "0.0-23.0",
               "from": 0,
               "from_as_string": "0.0",
               "to": 23,
               "to_as_string": "23.0",
               "doc_count": 716631
            },
            {
               "key": "11.0-14.0",
               "from": 11,
               "from_as_string": "11.0",
               "to": 14,
               "to_as_string": "14.0",
               "doc_count": 125284
            },
            {
               "key": "20.0-*",
               "from": 20,
               "from_as_string": "20.0",
               "doc_count": 101916
            }
         ]
      }
   }
}

Exemple de recherche avec un range de type date

De la même façon que nous avons fait une agréation par tranche de valeurs numériques on peut également faire cela avec des dates :

GET nyc_visionzero/_search?search_type=count
{
    "aggs" : {
        "date_ranges" : {
            "range" : {
                "field" : "@timestamp",
                "format": "dd-MM-yyy",
                "ranges": [
                    { 
                        "from": "now-1d"
                    },
                    {
                        "from" : "01-01-2016"
                    },
                    {
                        "from" : "01-12-2015",
                        "to" : "31-12-2015"
                    }
                ]
            }
        }
    }
}

Ici on demande à avoir les incidents qui sont survenus :

  1. La veille
  2. Depuis le 1er janvier 2016 jusqu’à maintenant
  3. Du 01/12/2015 au 31/12/2015

Résultat :

{
   "took": 28,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "date_ranges": {
         "buckets": [
            {
               "key": "01-12-2015-31-12-2015",
               "from": 1448928000000,
               "from_as_string": "01-12-2015",
               "to": 1451520000000,
               "to_as_string": "31-12-2015",
               "doc_count": 18328
            },
            {
               "key": "01-01-2016-*",
               "from": 1451606400000,
               "from_as_string": "01-01-2016",
               "doc_count": 8263
            },
            {
               "key": "20-01-2016-*",
               "from": 1453288050362,
               "from_as_string": "20-01-2016",
               "doc_count": 42
            }
         ]
      }
   }
}

 

Je ne vais pas passer en revue toutes les agrégations de type « bucket« , mais vous pourrez en trouver la liste exhaustive dans la documentation du site d’Elasticsearch.

Agrégations « metric »

Jusqu’à présent nos recherches nous retournent toujours le nombre total d’éléments trouvés en fonction des critères déclarés dans nos requêtes d’agrégations, parfait, mais on peut également demander à appliquer des calculs mathématique tels que des moyennes, la valeur minimum, le top 3 … dans la documentation d’Elasticsearch vous aurez la liste complète des opérations possibles.

Exemple de recherche donnant le centroïde

GET nyc_visionzero/_search?search_type=count
{
    "query" : {
        "match" : { "vehicle_type" : "TAXI" }
    },
    "aggs" : {
        "centroid" : {
            "geo_centroid" : { "field" : "coords" }
        }
    }
}

Cette requête se base sur les coordonnées de géolocalisation des incidents impliquant des taxis et nous donne le centroïde correspondant :

Résultat

{
   "took": 12,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 51843,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "centroid": {
         "location": {
            "lat": 40.751348950388326,
            "lon": -73.96526638571353
         }
      }
   }
}

Exemple de recherche avec un résultat de type Top 3

GET nyc_visionzero/_search?search_type=count
{
    "aggs": {
        "top-tags": {
            "terms": {
                "field": "cross_street_name",                
                "size": 3
            }
        }
    }
}

Nous demandons le top 3 des noms de carrefours avec le plus d’incidents enregistrés.

Résultat

{
   "took": 39,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "top-tags": {
         "doc_count_error_upper_bound": 2559,
         "sum_other_doc_count": 600344,
         "buckets": [
            {
               "key": "3 AVENUE",
               "doc_count": 9428
            },
            {
               "key": "BROADWAY",
               "doc_count": 9296
            },
            {
               "key": "2 AVENUE",
               "doc_count": 8100
            }
         ]
      }
   }
}

Les sous agrégations

Il est également possible d’imbriquer les agrégations est ainsi d’avoir des agrégations de type « bucket » au sein d’une agrégation « bucket« , idem pour les « metric » mais aussi de mixer les deux types d’agrégation.

Exemple de sous agrégation de type « bucket« 

GET /nyc_visionzero/_search?search_type=count
{
 "aggs" : {
  "all_boroughs": {
   "terms": {
    "field": "borough"
   },
   "aggs": {
    "cause": {
     "terms": {
      "field": "contributing_factor_vehicle",
      "size": 3
     },
     "aggs": {
      "incidents_per_month": {
       "date_histogram": {
        "field": "@timestamp",
        "interval": "month"
       }
      }
     }
    }
   }
  }
 }
}

Cette requête va nous renvoyer par arrondissement et par type les incidents survenus pour chaque mois.

Résultat :

{
   "took": 538,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "all_boroughs": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "BROOKLYN",
               "doc_count": 170884,
               "cause": {
                  "doc_count_error_upper_bound": 1518,
                  "sum_other_doc_count": 48917,
                  "buckets": [
                     {
                        "key": "Unspecified",
                        "doc_count": 102650,
                        "incidents_per_month": {
                           "buckets": [
                              {
                                 "key_as_string": "2012-06-01T00:00:00.000Z",
                                 "key": 1338508800000,
                                 "doc_count": 5
                              },
                              {
                                 "key_as_string": "2012-07-01T00:00:00.000Z",
                                 "key": 1341100800000,
                                 "doc_count": 2656
                              },
                              {
                                 "key_as_string": "2012-08-01T00:00:00.000Z",
                                 "key": 1343779200000,
                                 "doc_count": 2663
                              },
                              {
                                 "key_as_string": "2012-09-01T00:00:00.000Z",
                                 "key": 1346457600000,
                                 "doc_count": 2494
                              },
                              {
                                 "key_as_string": "2012-10-01T00:00:00.000Z",
                                 "key": 1349049600000,
                                 "doc_count": 2607
                              },
                              {
                                 "key_as_string": "2012-11-01T00:00:00.000Z",
                                 "key": 1351728000000,
                                 "doc_count": 2405
                              },
                              {
                                 "key_as_string": "2012-12-01T00:00:00.000Z",
                                 "key": 1354320000000,
                                 "doc_count": 2653
                              },
                              {
                                 "key_as_string": "2013-01-01T00:00:00.000Z",
                                 "key": 1356998400000,
                                 "doc_count": 2436
                              },
                              {
                                 "key_as_string": "2013-02-01T00:00:00.000Z",
                                 "key": 1359676800000,
                                 "doc_count": 2353
                              },
                              {
                                 "key_as_string": "2013-03-01T00:00:00.000Z",
                                 "key": 1362096000000,
                                 "doc_count": 2553
                              },
                              {
                                 "key_as_string": "2013-04-01T00:00:00.000Z",
                                 "key": 1364774400000,
                                 "doc_count": 2643
                              },
                              {
                                 "key_as_string": "2013-05-01T00:00:00.000Z",
                                 "key": 1367366400000,
                                 "doc_count": 2840
                              },
                              {
                                 "key_as_string": "2013-06-01T00:00:00.000Z",
                                 "key": 1370044800000,
                                 "doc_count": 2860
                              },
                              {
                                 "key_as_string": "2013-07-01T00:00:00.000Z",
                                 "key": 1372636800000,
                                 "doc_count": 2682
                              },
                              {
                                 "key_as_string": "2013-08-01T00:00:00.000Z",
                                 "key": 1375315200000,
                                 "doc_count": 2593
                              },
                              {
                                 "key_as_string": "2013-09-01T00:00:00.000Z",
                                 "key": 1377993600000,
                                 "doc_count": 2527
                              },
                              {
                                 "key_as_string": "2013-10-01T00:00:00.000Z",
                                 "key": 1380585600000,
                                 "doc_count": 2674
                              },
                              {
                                 "key_as_string": "2013-11-01T00:00:00.000Z",
                                 "key": 1383264000000,
                                 "doc_count": 2642
                              },
                              {
                                 "key_as_string": "2013-12-01T00:00:00.000Z",
                                 "key": 1385856000000,
                                 "doc_count": 2614
                              },
                              {
                                 "key_as_string": "2014-01-01T00:00:00.000Z",
                                 "key": 1388534400000,
                                 "doc_count": 2444
                              },
                              {
                                 "key_as_string": "2014-02-01T00:00:00.000Z",
                                 "key": 1391212800000,
                                 "doc_count": 2260
                              },
                              {
                                 "key_as_string": "2014-03-01T00:00:00.000Z",
                                 "key": 1393632000000,
                                 "doc_count": 2451
                              },
                              {
                                 "key_as_string": "2014-04-01T00:00:00.000Z",
                                 "key": 1396310400000,
                                 "doc_count": 2386
                              },
                              {
                                 "key_as_string": "2014-05-01T00:00:00.000Z",
                                 "key": 1398902400000,
                                 "doc_count": 2581
                              },
                              {
                                 "key_as_string": "2014-06-01T00:00:00.000Z",
                                 "key": 1401580800000,
                                 "doc_count": 2607
                              },
                              {
                                 "key_as_string": "2014-07-01T00:00:00.000Z",
                                 "key": 1404172800000,
                                 "doc_count": 2455
                              },
                              {
                                 "key_as_string": "2014-08-01T00:00:00.000Z",
                                 "key": 1406851200000,
                                 "doc_count": 2181
                              },
                              {
                                 "key_as_string": "2014-09-01T00:00:00.000Z",
                                 "key": 1409529600000,
                                 "doc_count": 2314
                              },
                              {
                                 "key_as_string": "2014-10-01T00:00:00.000Z",
                                 "key": 1412121600000,
                                 "doc_count": 2260
                              },
                              {
                                 "key_as_string": "2014-11-01T00:00:00.000Z",
                                 "key": 1414800000000,
                                 "doc_count": 2232
                              },
                              {
                                 "key_as_string": "2014-12-01T00:00:00.000Z",
                                 "key": 1417392000000,
                                 "doc_count": 2177
                              },
                              {
                                 "key_as_string": "2015-01-01T00:00:00.000Z",
                                 "key": 1420070400000,
                                 "doc_count": 2025
                              },
                              {
                                 "key_as_string": "2015-02-01T00:00:00.000Z",
                                 "key": 1422748800000,
                                 "doc_count": 1771
                              },
                              {
                                 "key_as_string": "2015-03-01T00:00:00.000Z",
                                 "key": 1425168000000,
                                 "doc_count": 2281
                              },
                              {
                                 "key_as_string": "2015-04-01T00:00:00.000Z",
                                 "key": 1427846400000,
                                 "doc_count": 2054
                              },
                              {
                                 "key_as_string": "2015-05-01T00:00:00.000Z",
                                 "key": 1430438400000,
                                 "doc_count": 2347
                              },
                              {
                                 "key_as_string": "2015-06-01T00:00:00.000Z",
                                 "key": 1433116800000,
                                 "doc_count": 2297
                              },
                              {
                                 "key_as_string": "2015-07-01T00:00:00.000Z",
                                 "key": 1435708800000,
                                 "doc_count": 2217
                              },
                              {
                                 "key_as_string": "2015-08-01T00:00:00.000Z",
                                 "key": 1438387200000,
                                 "doc_count": 2391
                              },
                              {
                                 "key_as_string": "2015-09-01T00:00:00.000Z",
                                 "key": 1441065600000,
                                 "doc_count": 2256
                              },
                              {
                                 "key_as_string": "2015-10-01T00:00:00.000Z",
                                 "key": 1443657600000,
                                 "doc_count": 2341
                              },
                              {
                                 "key_as_string": "2015-11-01T00:00:00.000Z",
                                 "key": 1446336000000,
                                 "doc_count": 2175
                              },
                              {
                                 "key_as_string": "2015-12-01T00:00:00.000Z",
                                 "key": 1448928000000,
                                 "doc_count": 2219
                              },
                              {
                                 "key_as_string": "2016-01-01T00:00:00.000Z",
                                 "key": 1451606400000,
                                 "doc_count": 1028
                              }
                           ]
                        }
                     },
                     {
                        "key": "Driver Inattention/Distraction",
                        "doc_count": 16634,
                        "incidents_per_month": {
                           "buckets": [
                              {
                                 "key_as_string": "2012-06-01T00:00:00.000Z",
                                 "key": 1338508800000,
                                 "doc_count": 1
                              },
                              {
                                 "key_as_string": "2012-07-01T00:00:00.000Z",
                                 "key": 1341100800000,
                                 "doc_count": 320
                              },
                              {
                                 "key_as_string": "2012-08-01T00:00:00.000Z",
                                 "key": 1343779200000,
                                 "doc_count": 297
                              },
                              {
                                 "key_as_string": "2012-09-01T00:00:00.000Z",
                                 "key": 1346457600000,
                                 "doc_count": 312
                              },
                              {
                                 "key_as_string": "2012-10-01T00:00:00.000Z",
                                 "key": 1349049600000,
                                 "doc_count": 289
                              },
                              {
                                 "key_as_string": "2012-11-01T00:00:00.000Z",
                                 "key": 1351728000000,
                                 "doc_count": 333
                              },
                              {
                                 "key_as_string": "2012-12-01T00:00:00.000Z",
                                 "key": 1354320000000,
                                 "doc_count": 346
                              },
                              {
                                 "key_as_string": "2013-01-01T00:00:00.000Z",
                                 "key": 1356998400000,
                                 "doc_count": 261
                              },
                              {
                                 "key_as_string": "2013-02-01T00:00:00.000Z",
                                 "key": 1359676800000,
                                 "doc_count": 246
                              },
                              {
                                 "key_as_string": "2013-03-01T00:00:00.000Z",
                                 "key": 1362096000000,
                                 "doc_count": 303
                              },
                              {
                                 "key_as_string": "2013-04-01T00:00:00.000Z",
                                 "key": 1364774400000,
                                 "doc_count": 303
                              },
                              {
                                 "key_as_string": "2013-05-01T00:00:00.000Z",
                                 "key": 1367366400000,
                                 "doc_count": 356
                              },
                              {
                                 "key_as_string": "2013-06-01T00:00:00.000Z",
                                 "key": 1370044800000,
                                 "doc_count": 336
                              },
                              {
                                 "key_as_string": "2013-07-01T00:00:00.000Z",
                                 "key": 1372636800000,
                                 "doc_count": 318
                              },
                              {
                                 "key_as_string": "2013-08-01T00:00:00.000Z",
                                 "key": 1375315200000,
                                 "doc_count": 289
                              },
                              {
                                 "key_as_string": "2013-09-01T00:00:00.000Z",
                                 "key": 1377993600000,
                                 "doc_count": 328
                              },
                              {
                                 "key_as_string": "2013-10-01T00:00:00.000Z",
                                 "key": 1380585600000,
                                 "doc_count": 343
                              },
                              {
                                 "key_as_string": "2013-11-01T00:00:00.000Z",
                                 "key": 1383264000000,
                                 "doc_count": 351
                              },
                              {
                                 "key_as_string": "2013-12-01T00:00:00.000Z",
                                 "key": 1385856000000,
                                 "doc_count": 291
                              },
                              {
                                 "key_as_string": "2014-01-01T00:00:00.000Z",
                                 "key": 1388534400000,
                                 "doc_count": 311
                              },
                              {
                                 "key_as_string": "2014-02-01T00:00:00.000Z",
                                 "key": 1391212800000,
                                 "doc_count": 280
                              },
                              {
                                 "key_as_string": "2014-03-01T00:00:00.000Z",
                                 "key": 1393632000000,
                                 "doc_count": 281
                              },
                              {
                                 "key_as_string": "2014-04-01T00:00:00.000Z",
                                 "key": 1396310400000,
                                 "doc_count": 329
                              },
                              {
                                 "key_as_string": "2014-05-01T00:00:00.000Z",
                                 "key": 1398902400000,
                                 "doc_count": 395
                              },
                              {
                                 "key_as_string": "2014-06-01T00:00:00.000Z",
                                 "key": 1401580800000,
                                 "doc_count": 430
                              },
                              {
                                 "key_as_string": "2014-07-01T00:00:00.000Z",
                                 "key": 1404172800000,
                                 "doc_count": 410
                              },
                              {
                                 "key_as_string": "2014-08-01T00:00:00.000Z",
                                 "key": 1406851200000,
                                 "doc_count": 442
                              },
                              {
                                 "key_as_string": "2014-09-01T00:00:00.000Z",
                                 "key": 1409529600000,
                                 "doc_count": 450
                              },
                              {
                                 "key_as_string": "2014-10-01T00:00:00.000Z",
                                 "key": 1412121600000,
                                 "doc_count": 475
                              },
                              {
                                 "key_as_string": "2014-11-01T00:00:00.000Z",
                                 "key": 1414800000000,
                                 "doc_count": 404
                              },
                              {
                                 "key_as_string": "2014-12-01T00:00:00.000Z",
                                 "key": 1417392000000,
                                 "doc_count": 469
                              },
                              {
                                 "key_as_string": "2015-01-01T00:00:00.000Z",
                                 "key": 1420070400000,
                                 "doc_count": 412
                              },
                              {
                                 "key_as_string": "2015-02-01T00:00:00.000Z",
                                 "key": 1422748800000,
                                 "doc_count": 372
                              },
                              {
                                 "key_as_string": "2015-03-01T00:00:00.000Z",
                                 "key": 1425168000000,
                                 "doc_count": 457
                              },
                              {
                                 "key_as_string": "2015-04-01T00:00:00.000Z",
                                 "key": 1427846400000,
                                 "doc_count": 435
                              },
                              {
                                 "key_as_string": "2015-05-01T00:00:00.000Z",
                                 "key": 1430438400000,
                                 "doc_count": 557
                              },
                              {
                                 "key_as_string": "2015-06-01T00:00:00.000Z",
                                 "key": 1433116800000,
                                 "doc_count": 543
                              },
                              {
                                 "key_as_string": "2015-07-01T00:00:00.000Z",
                                 "key": 1435708800000,
                                 "doc_count": 560
                              },
                              {
                                 "key_as_string": "2015-08-01T00:00:00.000Z",
                                 "key": 1438387200000,
                                 "doc_count": 500
                              },
                              {
                                 "key_as_string": "2015-09-01T00:00:00.000Z",
                                 "key": 1441065600000,
                                 "doc_count": 591
                              },
                              {
                                 "key_as_string": "2015-10-01T00:00:00.000Z",
                                 "key": 1443657600000,
                                 "doc_count": 617
                              },
                              {
                                 "key_as_string": "2015-11-01T00:00:00.000Z",
                                 "key": 1446336000000,
                                 "doc_count": 528
                              },
                              {
                                 "key_as_string": "2015-12-01T00:00:00.000Z",
                                 "key": 1448928000000,
                                 "doc_count": 521
                              },
                              {
                                 "key_as_string": "2016-01-01T00:00:00.000Z",
                                 "key": 1451606400000,
                                 "doc_count": 242
                              }
                           ]
                        }
                     },
                     {
                        "key": "Failure to Yield Right-of-Way",
                        "doc_count": 9373,
                        "incidents_per_month": {
                           "buckets": [
                              {
                                 "key_as_string": "2012-07-01T00:00:00.000Z",
                                 "key": 1341100800000,
                                 "doc_count": 154
                              },
                              {
                                 "key_as_string": "2012-08-01T00:00:00.000Z",
                                 "key": 1343779200000,
                                 "doc_count": 182
                              },
                              {
                                 "key_as_string": "2012-09-01T00:00:00.000Z",
                                 "key": 1346457600000,
                                 "doc_count": 185
                              },
                              {
                                 "key_as_string": "2012-10-01T00:00:00.000Z",
                                 "key": 1349049600000,
                                 "doc_count": 208
                              },
                              {
                                 "key_as_string": "2012-11-01T00:00:00.000Z",
                                 "key": 1351728000000,
                                 "doc_count": 192
                              },
                              {
                                 "key_as_string": "2012-12-01T00:00:00.000Z",
                                 "key": 1354320000000,
                                 "doc_count": 203
                              },
                              {
                                 "key_as_string": "2013-01-01T00:00:00.000Z",
                                 "key": 1356998400000,
                                 "doc_count": 190
                              },
                              {
                                 "key_as_string": "2013-02-01T00:00:00.000Z",
                                 "key": 1359676800000,
                                 "doc_count": 138
                              },
                              {
                                 "key_as_string": "2013-03-01T00:00:00.000Z",
                                 "key": 1362096000000,
                                 "doc_count": 149
                              },
                              {
                                 "key_as_string": "2013-04-01T00:00:00.000Z",
                                 "key": 1364774400000,
                                 "doc_count": 162
                              },
                              {
                                 "key_as_string": "2013-05-01T00:00:00.000Z",
                                 "key": 1367366400000,
                                 "doc_count": 223
                              },
                              {
                                 "key_as_string": "2013-06-01T00:00:00.000Z",
                                 "key": 1370044800000,
                                 "doc_count": 188
                              },
                              {
                                 "key_as_string": "2013-07-01T00:00:00.000Z",
                                 "key": 1372636800000,
                                 "doc_count": 191
                              },
                              {
                                 "key_as_string": "2013-08-01T00:00:00.000Z",
                                 "key": 1375315200000,
                                 "doc_count": 168
                              },
                              {
                                 "key_as_string": "2013-09-01T00:00:00.000Z",
                                 "key": 1377993600000,
                                 "doc_count": 196
                              },
                              {
                                 "key_as_string": "2013-10-01T00:00:00.000Z",
                                 "key": 1380585600000,
                                 "doc_count": 200
                              },
                              {
                                 "key_as_string": "2013-11-01T00:00:00.000Z",
                                 "key": 1383264000000,
                                 "doc_count": 221
                              },
                              {
                                 "key_as_string": "2013-12-01T00:00:00.000Z",
                                 "key": 1385856000000,
                                 "doc_count": 219
                              },
                              {
                                 "key_as_string": "2014-01-01T00:00:00.000Z",
                                 "key": 1388534400000,
                                 "doc_count": 207
                              },
                              {
                                 "key_as_string": "2014-02-01T00:00:00.000Z",
                                 "key": 1391212800000,
                                 "doc_count": 178
                              },
                              {
                                 "key_as_string": "2014-03-01T00:00:00.000Z",
                                 "key": 1393632000000,
                                 "doc_count": 194
                              },
                              {
                                 "key_as_string": "2014-04-01T00:00:00.000Z",
                                 "key": 1396310400000,
                                 "doc_count": 196
                              },
                              {
                                 "key_as_string": "2014-05-01T00:00:00.000Z",
                                 "key": 1398902400000,
                                 "doc_count": 206
                              },
                              {
                                 "key_as_string": "2014-06-01T00:00:00.000Z",
                                 "key": 1401580800000,
                                 "doc_count": 212
                              },
                              {
                                 "key_as_string": "2014-07-01T00:00:00.000Z",
                                 "key": 1404172800000,
                                 "doc_count": 217
                              },
                              {
                                 "key_as_string": "2014-08-01T00:00:00.000Z",
                                 "key": 1406851200000,
                                 "doc_count": 219
                              },
                              {
                                 "key_as_string": "2014-09-01T00:00:00.000Z",
                                 "key": 1409529600000,
                                 "doc_count": 274
                              },
                              {
                                 "key_as_string": "2014-10-01T00:00:00.000Z",
                                 "key": 1412121600000,
                                 "doc_count": 282
                              },
                              {
                                 "key_as_string": "2014-11-01T00:00:00.000Z",
                                 "key": 1414800000000,
                                 "doc_count": 251
                              },
                              {
                                 "key_as_string": "2014-12-01T00:00:00.000Z",
                                 "key": 1417392000000,
                                 "doc_count": 263
                              },
                              {
                                 "key_as_string": "2015-01-01T00:00:00.000Z",
                                 "key": 1420070400000,
                                 "doc_count": 239
                              },
                              {
                                 "key_as_string": "2015-02-01T00:00:00.000Z",
                                 "key": 1422748800000,
                                 "doc_count": 195
                              },
                              {
                                 "key_as_string": "2015-03-01T00:00:00.000Z",
                                 "key": 1425168000000,
                                 "doc_count": 253
                              },
                              {
                                 "key_as_string": "2015-04-01T00:00:00.000Z",
                                 "key": 1427846400000,
                                 "doc_count": 239
                              },
                              {
                                 "key_as_string": "2015-05-01T00:00:00.000Z",
                                 "key": 1430438400000,
                                 "doc_count": 280
                              },
                              {
                                 "key_as_string": "2015-06-01T00:00:00.000Z",
                                 "key": 1433116800000,
                                 "doc_count": 249
                              },
                              {
                                 "key_as_string": "2015-07-01T00:00:00.000Z",
                                 "key": 1435708800000,
                                 "doc_count": 280
                              },
                              {
                                 "key_as_string": "2015-08-01T00:00:00.000Z",
                                 "key": 1438387200000,
                                 "doc_count": 230
                              },
                              {
                                 "key_as_string": "2015-09-01T00:00:00.000Z",
                                 "key": 1441065600000,
                                 "doc_count": 284
                              },
                              {
                                 "key_as_string": "2015-10-01T00:00:00.000Z",
                                 "key": 1443657600000,
                                 "doc_count": 289
                              },
                              {
                                 "key_as_string": "2015-11-01T00:00:00.000Z",
                                 "key": 1446336000000,
                                 "doc_count": 272
                              },
                              {
                                 "key_as_string": "2015-12-01T00:00:00.000Z",
                                 "key": 1448928000000,
                                 "doc_count": 335
                              },
                              {
                                 "key_as_string": "2016-01-01T00:00:00.000Z",
                                 "key": 1451606400000,
                                 "doc_count": 160
                              }
                           ]
                        }
                     }
                  ]
               }
            },
            {
               "key": "MANHATTAN",
               "doc_count": 147516,
               "cause": {
                  "doc_count_error_upper_bound": 1403,
                  "sum_other_doc_count": 58714,
                  "buckets": [
                     {
                        "key": "Unspecified",
                        "doc_count": 65289,
                        "incidents_per_month": {
                           "buckets": [
                              {
                                 "key_as_string": "2012-06-01T00:00:00.000Z",
                                 "key": 1338508800000,
                                 "doc_count": 1
                              },
                              {
                                 "key_as_string": "2012-07-01T00:00:00.000Z",
                                 "key": 1341100800000,
                                 "doc_count": 1963
                              },
                              {
                                 "key_as_string": "2012-08-01T00:00:00.000Z",
                                 "key": 1343779200000,
                                 "doc_count": 1954
                              },
                              {
                                 "key_as_string": "2012-09-01T00:00:00.000Z",
                                 "key": 1346457600000,
                                 "doc_count": 1869
                              },
                              {
                                 "key_as_string": "2012-10-01T00:00:00.000Z",
                                 "key": 1349049600000,
                                 "doc_count": 1843
                              },
                              {
                                 "key_as_string": "2012-11-01T00:00:00.000Z",
                                 "key": 1351728000000,
                                 "doc_count": 1702
                              },
                              {
                                 "key_as_string": "2012-12-01T00:00:00.000Z",
                                 "key": 1354320000000,
                                 "doc_count": 1839
                              },
							  ...
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

 

Exemple de sous agrégation de type « metric« 

GET nyc_visionzero/_search?search_type=count
{
    "aggs": {
        "top-tags": {
            "terms": {
                "field": "cross_street_name",
                "size": 3
            },
            "aggs": {
                "top_tag_hits": {
                    "top_hits": {
                        "sort": [
                            {
                                "borough": {
                                    "order": "asc"
                                }
                            }
                        ],
                        "_source": {
                            "include": [
                                "borough",
                                "contributing_factor_vehicle"
                            ]
                        },
                        "size" : 3
                    }
                }
            }
        }
    }
}

 

J’ai repris la requête sur le top 3 des croisements avec le plus d’incidents dans laquelle je veux connaitre le nom de l’arrondissement et le top 3 des incidents par croisement.

Résultat :

{
   "took": 112,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "top-tags": {
         "doc_count_error_upper_bound": 2559,
         "sum_other_doc_count": 600344,
         "buckets": [
            {
               "key": "3 AVENUE",
               "doc_count": 9428,
               "top_tag_hits": {
                  "hits": {
                     "total": 9428,
                     "max_score": null,
                     "hits": [
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexYCEDCAjHU4IlkJd",
                           "_score": null,
                           "_source": {
                              "borough": "BRONX",
                              "contributing_factor_vehicle": "Unspecified"
                           },
                           "sort": [
                              "BRONX"
                           ]
                        },
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexYecDCAjHU4Ilk-i",
                           "_score": null,
                           "_source": {
                              "borough": "BRONX",
                              "contributing_factor_vehicle": "Driver Inattention/Distraction"
                           },
                           "sort": [
                              "BRONX"
                           ]
                        },
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexZx1DCAjHU4IlnJB",
                           "_score": null,
                           "_source": {
                              "borough": "BRONX",
                              "contributing_factor_vehicle": [
                                 "Driver Inattention/Distraction",
                                 "Prescription Medication"
                              ]
                           },
                           "sort": [
                              "BRONX"
                           ]
                        }
                     ]
                  }
               }
            },
            {
               "key": "BROADWAY",
               "doc_count": 9296,
               "top_tag_hits": {
                  "hits": {
                     "total": 9296,
                     "max_score": null,
                     "hits": [
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexZ-sDCAjHU4Ilngz",
                           "_score": null,
                           "_source": {
                              "borough": "BRONX",
                              "contributing_factor_vehicle": "Driver Inattention/Distraction"
                           },
                           "sort": [
                              "BRONX"
                           ]
                        },
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexiA2DCAjHU4IlzrA",
                           "_score": null,
                           "_source": {
                              "borough": "BRONX",
                              "contributing_factor_vehicle": "Unspecified"
                           },
                           "sort": [
                              "BRONX"
                           ]
                        },
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexhHtDCAjHU4IlyN5",
                           "_score": null,
                           "_source": {
                              "borough": "BRONX",
                              "contributing_factor_vehicle": "Unspecified"
                           },
                           "sort": [
                              "BRONX"
                           ]
                        }
                     ]
                  }
               }
            },
            {
               "key": "2 AVENUE",
               "doc_count": 8100,
               "top_tag_hits": {
                  "hits": {
                     "total": 8100,
                     "max_score": null,
                     "hits": [
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexXs0DCAjHU4Iljrp",
                           "_score": null,
                           "_source": {
                              "borough": "BROOKLYN",
                              "contributing_factor_vehicle": "Unspecified"
                           },
                           "sort": [
                              "BROOKLYN"
                           ]
                        },
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexYecDCAjHU4Ilk3-",
                           "_score": null,
                           "_source": {
                              "borough": "BROOKLYN",
                              "contributing_factor_vehicle": "Unspecified"
                           },
                           "sort": [
                              "BROOKLYN"
                           ]
                        },
                        {
                           "_index": "nyc_visionzero",
                           "_type": "logs",
                           "_id": "AVJexYecDCAjHU4Ilk4o",
                           "_score": null,
                           "_source": {
                              "borough": "BROOKLYN",
                              "contributing_factor_vehicle": "Driver Inattention/Distraction"
                           },
                           "sort": [
                              "BROOKLYN"
                           ]
                        }
                     ]
                  }
               }
            }
         ]
      }
   }
}

Exemple de sous agrégation mixée

GET /nyc_visionzero/_search?search_type=count
{
 "aggs" : {
  "all_boroughs": {
   "terms": {
    "field": "borough"
   },
   "aggs": {
    "total_cyclists_injured": {
     "sum" : {
      "field": "number_of_cyclist_injured"
     }
    }
   }
  }
 }
}

Nous obtiendrons le nombre de cyclistes blessés par arrondissement.

Résultat :

{
   "took": 37,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 735858,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "all_boroughs": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "BROOKLYN",
               "doc_count": 170884,
               "total_cyclists_injured": {
                  "value": 5371
               }
            },
            {
               "key": "MANHATTAN",
               "doc_count": 147516,
               "total_cyclists_injured": {
                  "value": 4054
               }
            },
            {
               "key": "QUEENS",
               "doc_count": 143586,
               "total_cyclists_injured": {
                  "value": 2616
               }
            },
            {
               "key": "BRONX",
               "doc_count": 71048,
               "total_cyclists_injured": {
                  "value": 1172
               }
            },
            {
               "key": "STATEN ISLAND",
               "doc_count": 26401,
               "total_cyclists_injured": {
                  "value": 131
               }
            }
         ]
      }
   }
}

 

Conclusion

Nous arrivons à la fin de cette « petite » présentation des agrégations d’Elasticsearch, qui, je l’espère, vous aura donné envie d’utiliser cette fonctionnalité qui permet d’exploiter différemment vos données indexées, pour par exemple remplir des graphiques ou alimenter des modules de reporting.

Je vous laisse le soin de parcourir la documentation pour trouver votre bonheur dans la liste des agrégations disponibles, notez que vous pouvez même créer des agrégations « bucket » et « metric » avec vos propres règles métier par script!

2 commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

4 + huit =