Aggregations in Elasticsearch

von Tobias Kraft

Dieser Beitrag geht auf die mit der Version 1.0.0 [1] eingeführten Aggregations in Elasticsearch anhand von praktischen Beispielen ein. Basis zur Veranschaulichung der Aggregations ist ein indexiertes Jira-System. Deshalb wird zunächst vorgestellt, wie einfach die Indexierung von Jira erfolgen kann.

Indexierung von Jira

Jira ist ein geeignetes Werkzeug zur Verwaltung von Tickets und Aufgaben, sogenannten Issues. Vereinfacht kann man sagen, dass die Gliederung in einzelne Projekte erfolgt und diesen werden die Issues zugeordnet. In Jira selbst gibt es natürlich ebenfalls eine Suche. Wird jedoch eine Enterprise Suche umgesetzt, bei der Jira eines von mehreren Quellsystemen ist, kann es sinnvoll sein Jira auch extern zu indizieren. 

Eine Möglichkeit zur Indexierung von Jira ist die Verwendung des Jira River Plugins [3]. Nach der Installation des Plugins muss lediglich die Konfiguration definiert werden. Dies spielt sich in unserem Fall über einen JSON-Aufruf ab, der bspw. mit Hilfe des Chrome-Plugins Sense [4] ausgeführt wird. Für das Beispiel werden nur ausgewählte Projekte von Jira dem Index hinzugefügt.

Der River verwendet die JSON-API von Jira für den Aufbau des Index. In regelmäßigen, konfigurierbaren Abständen sorgt das River-Plugin für die automatische Aktualisierung des Index. Jeder Jira-Issue resultiert wie nachfolgend dargestellt in einem eigenen Dokument mit den entsprechend gefüllten Feldern aus Jira.

Aggregations

Die Einführung von Aggregations ist, wie schon erwähnt, mit der Version 1.0.0 erfolgt und es wird empfohlen mittelfristig von Facetten auf Aggregations umzustellen. Konkret lässt dies vermuten, dass Facetten in einer zukünftigen Version nicht mehr unterstützt werden. 
Vereinfacht funktioniert eine Aggregation folgenderweise: Sie bekommt eine gewisse Anzahl an Dokumenten als Input und liefert als Output Töpfe (Buckets), die ein Subset der Input-Dokumente und Statistiken enthalten. 
Es werden die beiden Arten »Metric« und »Buckets« unterschieden. Ein »Metric«-Aggregator berechnet auf Grundlage der Input-Dokumente entsprechende Statistiken, wie bspw. das Minimum. Mit »Buckets« erfolgt die Einteilung der Dokumente in Töpfe über Kriterien wie bspw. ein Feld. 

Ein sinniger Anwendungsfall für Aggregations auf Basis des Jira-Indexes ist die Bereitstellung einer Suchfunktion, mit deren Hilfe Issues anhand von Kriterien gruppiert werden können. Das nachfolgende Beispiel zeigt die Aggregation über die beiden Felder Projekt (project_key) und Issue-Ersteller (reporter). Mit dem Schlüsselwort »aggs« bzw. »aggregation« wird ein entsprechender Block geöffnet, in dem die Gruppierung für die jeweiligen Felder definiert wird.

Das zurückgelieferte Ergebnis zeigt in unserem Fall für die Projekte und Ersteller einen eigenen Block mit den Resultaten an. Für jedes Gruppierungsresultat ist die Anzahl der Treffer sichtbar. Neben der im Beispiel eingesetzten »terms«-Aggregation gibt es einige weitere Aggregatoren, bspw. zur Berechnung von Durchschnittswerten oder Summen sowie auch Bereichen. 
Denkbar ist unter anderem die Gruppierung der Issues nach Erstellungszeiträumen. Mit dem nachfolgenden Ausschnitt bekommt heraus wie viele Issues im Zeitraum der letzten ein, zwei, drei oder sechs Monaten angelegt wurden.

Verschachtelte Aggregationen

Interessant ist die Möglichkeit zur Verschachtelung von Aggregations. Möchte man sich beispielsweise abhängig vom JIRA-Projekt die Anzahl der erstellten Issues pro Jahr anzeigen lassen, kann dies durch Verschachtelung erfolgen. Zunächst werden die Jira-Projekte mit Hilfe einer Term-Aggregation eingeteilt. Anschließend wird über ein »date_histogram« nach Erstellungs-Jahr gruppiert.

Unterhalb des Erstellungsjahres könnten hier weitere verschachtelte Aggregationen wie bspw. die Gruppierung nach Monat oder dem Ersteller erfolgen.

Fazit

Anhand der aufgeführten einfachen Beispiele wird die Mächtigkeit der Aggregations sichtbar. Mit den Aggregations wird Elasticsearch für den Bereich Data Warehouse und Online Analytics immer interessanter.

Kategorien: ElasticsearchJira

Zurück