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.
Weitere Beiträge
von Christian Börner-Schulte
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
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.
Blog-Autor*in
Christian Börner-Schulte
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.