Tutoriel pour comprendre les agrégations avec ElasticSearch

Image non disponible

Ce tutoriel vous apprend à comprendre les agrégations avec ElasticSearch.

Pour réagir au contenu de cet article, un espace de dialogue vous est proposé sur le forum Commentez Donner une note  l'article (5).

Article lu   fois.

Les deux auteurs

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

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 recherche.

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.

En plus d'offrir des fonctionnalités avancées de recherche, Elasticsearch permet également de faire des agrégations sur vos données, c'est à dire d’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.

II. Avant de commencer

II-A. Installation

On va tout d'abord installer tout ce dont nous avons besoin, pour cela assurez-vous d'avoir un JDK 7 minimum installé et la variable JAVA_HOME 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 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.

II-B. 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 et faites de même avec ce fichier : nyc_collision_logstash. Ouvrez une fenêtre de commande à l'emplacement du dossier « bin » puis exécutez la commande suivante :

 
Sélectionnez
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  :

 
Sélectionnez
GET /nyc_visionzero/_count

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

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
{
   "count": 735858,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   }
}

qui nous indique que notre index nyc_visionzero contient 735858 documents.

III. Agrégeons

III-A. 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.

III-A-1. Agrégation simple

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

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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-clef 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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
{
   "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.

III-A-2. 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 valeurs.

Exemple d'une répartition par mois :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
{
   "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 de 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.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
GET nyc_visionzero/_search?search_type=count
{
 "aggs" : {
  "injuries": {
   "histogram": {
    "field": "number_of_persons_injured",
    "interval": 10
   }
  }
 }
}

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
{
   "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.

III-A-3. Agrégation par tranche

L'agrégation par tranche, range, permet d'obtenir le nombre d'incidents en bornant la recherche avec une valeur minimale et/ou une valeur maximale.

Exemple de recherche avec un range de type numérique :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 :

  • jusqu'à 9 heures du matin ;
  • de 0 à 23h ;
  • de 11 à 14h ;
  • après 20h.

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
{
   "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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 :

  • la veille ;
  • depuis le 1er janvier 2016 jusqu'à maintenant ;
  • du 01/12/2015 au 31/12/2015.

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
{
   "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.

III-B. 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ématiques tels que des moyennes, la valeur minimale, les n premiers... dans la documentation d'Elasticsearch vous aurez la liste complète des opérations possibles.

Exemple de recherche donnant le centroïde :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 :

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
{
   "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 restituant les trois premiers :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
GET nyc_visionzero/_search?search_type=count
{
    "aggs": {
        "top-tags": {
            "terms": {
                "field": "cross_street_name",
                "size": 3
            }
        }
    }
}

Nous demandons les noms des trois carrefours ayant le plus grand nombre d'incidents enregistrés.

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
{
   "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
            }
         ]
      }
   }
}

III-C. Les sous-agrégations

Il est également possible d'imbriquer les agrégations et 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égations.

Exemple de sous-agrégation de type bucket :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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.

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
751.
752.
753.
754.
755.
756.
757.
758.
759.
760.
761.
762.
763.
764.
765.
{
   "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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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 les trois croisements ayant le plus grand nombre d'incidents dans laquelle je veux connaître le nom de l'arrondissement et le « top 3 » des incidents par croisement.

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
{
   "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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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.

Le résultat :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
{
   "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
               }
            }
         ]
      }
   }
}

IV. Conclusion

Nous arrivons à la fin de cette « petite » présentation des agrégations d'Elasticsearch. J’espère qu’elle vous aura donné envie d'utiliser ces fonctionnalités qui permettent 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 !

V. Remerciements

Cet article a été publié avec l'aimable autorisation de Netapsys.

Nous tenons à remercier escartefigue pour la relecture orthographique attentive de cet article et Mickael Baron pour la mise au gabarit.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2020 Netapsys. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.