Beliebte Suchanfragen
//

Elasticsearch: _type-Mapping zur Dateninspektion

5.12.2016 | 3 Minuten Lesezeit

Problemsituation

Eine typische Situation: Daten aus einer Domän mit verschiedenen Sub-Domänen liegen in stark unterschiedlicher und unbekannter Form, mit ebenso unterschiedlichen und unbekannten Werten, vor. Sich mit diesen Daten auseinanderzusetzen ist kostspielig und undankbar. Lassen sich diese Daten jedoch beispielsweise anhand der Domänen klassifizieren, so hilft die Mapping-Information des Types in Elasticsearch.

Um diese Problemsituation verständlicher darzustellen, wird folgende Beispiel-Domäne verwendet:
Es liegen Artikeldaten vor. Diese Artikel sind in verschiedene (Unter-)Sortimente klassifiziert, die einer Nummerung unterliegen. Jeder Artikel verfügt über eine Menge von Eigenschaften, die allgemeingültig sind. Andere Eigenschaften unterscheiden sich stark je Artikel und (Unter-)Sortiment. Außerdem sind sie unstrukturiert.

Lösung

Schema

Der hier beschriebene Lösungsansatz besteht darin, die Hierarchien, die in der Nummerung abgebildet sind, als zusätzliche Information in das Dokument des Objektes einzubetten. Die übergeordnete Nummer, die das Sortiment klassifiziert, wird dabei als Wert für _type genommen. Die unstrukturierten Werte werden als Unterobjekt mit dem Namen values in das Artikeldokument eingefügt:

1{
2  "_index": "articles",
3  "_type": "300500100",
4  "_id": "2",
5  "_score": 1.0,
6  "_source": {
7     "description": "Salami",
8     "values": {
9            "variety": "pork",
10            "weight": "100",
11            "additives": "preservatives"
12     }
13  }
14}

Grundsätzlich muss bei einem derartigen Ansatz darauf geachtet werden, wie sparse respektive dense die vorliegenden Daten sind. Sind die Daten innerhalb des Index sparse, kann es zu Performance-Problemen kommen. Weitere Informationen dazu finden sich hier .

Data Inspection

Die Data Inspection erfolgt in zwei Schritten. Im ersten Schritt wird das Mapping des Index abgefragt. Im Beispiel nehmen wir dazu an, dass eine ES-Installation mit dem Index articles zur Verfügung steht.

1curl http://localhost:9200/articles/_mappings

Das Ergebnis dieser Abfrage entspricht diesem JSON-Dokument. Direkt unter mappings befindet sich der Wert für den jeweiligen _type, z.B. 300500100. Tiefer im Baum befinden sich properties für Wert values, z.B. additives und variety:

1{
2  "articles": {
3    "mappings": {
4      "300500100": {
5        "properties": {
6          "description": {
7            "type": "string"
8          },
9          "values": {
10            "properties": {
11              "additives": {
12                "type": "string"
13              },
14              "country_of_origin": {
15                "type": "string"
16              },
17              "variety": {
18                "type": "string"
19              },
20              "weight": {
21                "type": "string"
22              }
23            }
24          }
25        }
26      },
27      "300500200": {
28        "properties": {
29          "description": {
30            "type": "string"
31          },
32          "values": {
33            "properties": {
34              "country_of_origin": {
35                "type": "string"
36              },
37              "variety": {
38                "type": "string"
39              },
40              "veggy": {
41                "type": "string"
42              },
43              "weight": {
44                "type": "string"
45              }
46            }
47          }
48        }
49      }
50    }
51  }
52}

Der nächste Schritt besteht darin, dass sowohl der Wert für _type und die jeweiligen Attribut-Namen properties für values gemerkt werden.

Als nächstes wird mit diesen Werten eine Abfrage formuliert, um bspw. eine Aggregation zu erhalten, deren Ergebnis die Attributnamen und die Anzahl der Ausprägungen in dem gegebenen _type enthält.

1curl 'http://localhost:9200/articles/300500100/_search' -d '
2{
3 "size": 0,
4 "aggs": {
5    "additives":{
6      "terms":{
7        "field":"values.additives"
8      }
9    },
10    "weight":{
11      "terms":{
12        "field":"values.weight"
13      }
14    },
15    "variety":{
16      "terms":{
17        "field":"values.variety"
18      }
19    },
20    "country_of_origin":{
21      "terms":{
22        "field":"values.country_of_origin"
23      }
24    }    
25  }
26}'

Die Abfrage lässt sich erweitern, um die Daten innerhalb eines Untersortiments oder zwischen unterschiedlichen Sortimenten zu evaluieren.

Mit dieser Abfrage können mehrere Untersortimente aggregiert werden. Zuvor müssen die gemerkten Attributnamen miteinander verknüpft werden.

1curl 'http://localhost:9200/articles/300500100,300500200/_search?pretty' -d '
2{
3 "size": 0,
4 "aggs": {
5    "additives":{
6      "terms":{
7        "field":"values.additives"
8      }
9    },
10    "weight":{
11      "terms":{
12        "field":"values.weight"
13      }
14    },
15    "variety":{
16      "terms":{
17        "field":"values.variety"
18      }
19    },
20    "country_of_origin":{
21      "terms":{
22        "field":"values.country_of_origin"
23      }
24    },
25    "veggy":{
26      "terms":{
27        "field":"values.veggy"
28      }
29    }    
30  }
31}'

Fazit

Mithilfe des _type-Mappings hat man insbesondere bei unstrukturierten und unbekannten Daten ein einfaches und gleichzeitig mächtiges Werkzeug, um den Datenbestand von kategorisierten Dokumenten zu evaluieren. Die so gewonnenen Informationen können u.a. Aufschluss über Datenqualität geben. Auch Erkenntnisse über die Qualität der vorhandenen Kategorien können abgeleitet werden, um Dokumente zwischen den Kategorien zu verschieben, Kategorien hinzuzufügen oder bestehende zu entfernen, mit anderen zu kombinieren.

Beitrag teilen

//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//

Gemeinsam bessere Projekte umsetzen.

Wir helfen deinem Unternehmen.

Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.

Hilf uns, noch besser zu werden.

Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.