Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Elasticsearch Grundkurs

Dokumente über geschachtelte Objekte durchsuchen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Geschachtelte Objekte verfügen in Elasticsearch über eine besondere Abfragesyntax, die es Ihnen ermöglicht, auch in dieser Art von Dokumentenstruktur zu suchen. In diesem Video erfahren Sie, wie miteinander verbundene oder geschachtelte Dokumente durchsucht werden können.

Transkript

Als eine Datenbank, die auf Basis von JSON arbeitet unterstützt Elasticsearch selbstverständlich auch geschachtelte Objekte. Allerdings gibt es dabei einige Besonderheiten, die ich Ihnen im Folgenden zeigen möchte. Dafür benötige ich zunächst einmal Daten im meinem Index "Movies". Ich importiere die für mich relevanten Bibliotheken und lade nun von der Liste der 250 besten Filme auf IMDb. Genau, zwei dieser Filme hier nur anhand ihres Jahres und Titels herunter. Diese beiden Filme nehme ich nun und füge hier zusätzlich geschachtelte Objekte in Form einer Liste von Kommentaren hinzu. So hat also der Film "Whiplash" zwei Kommentare, einmal von Michael und einmal von Christopher, mit jeweils einer Bewertung und einem Text. Ähnlich der Film "Seven Samurai", der eine Bewertung von Sabine und Jennifer hat. Als nächstes füge ich nun diese Filme samt ihrer Kommentare in meinem Index "Movies" hinzu. Automatisch erstellt nun Elasticsearch ein entsprechendes Maping für mein Kommentarfeld. Man sieht also, dass "comments" nochmal eigene "properties" beinhaltet in Form von "Rating", "Text" und "username". Um nun in einem solchen gensesteten Objekt suchen zu können, benutze ich die Syntax mit der Punktnotation. Also unterhalb von "comments" suche ich auf dem "username"-Feld nach "Christopher". Ich finde hier nun selbstverständlich das gesamte Dokument. Das bedeutet, ich finde nicht nur meinen Kommentar von Christopher den ich ursprünglich gesucht hatte, sondern auch den Kommentar von Michael. Denn meine Suche hat nicht innerhalb der Kommentare gesucht, sondern Dokumente, die dieses Kriterium erfüllen. In dem Fall also der gesamte Film "Whiplash". Was aber, wenn ich nun Dinge tue, die ich spontan für intuitiv halte. Beispielsweise möchte ich nach Filmen suchen, bei denen Christopher einen Kommentar hinterlassen hat und er als solches eine Bewertung abgegeben hat, die höher als 2.1 oder 2.1 selbst ist. In dem Fall erhalte ich nun das von mir gesuchte Ergebnis. Erhöhe ich nun allerdings das von mir gesuchte Rating beispielsweise auf 2.3, bekomme ich immer noch das Ergebnis, obwohl Christopher hier nicht die Bewertung abgegeben hat, die höher ist als 2.3, Sondern lediglich Michael, der 4.3 als Bewertung angegeben hat. Das Problem an dieser Stelle ist, dass Elasticsearch nicht die Kommentare, als einzelne Objekte unterscheidet, sondern beide Werte beispielsweise für das Rating innerhalb eines Feldes abspeichert. Aus diesem Grund erhalte ich hier ein intuitives Ergebnis. Allerdings bietet mir Elasticsearch hier Möglichkeiten, das nach meinen Vorstellungen zu realisieren. Dafür lösche ich nun zunächst meinen Index. Als nächstes gebe ich vor der Indizierung mit Hilfe des Mappings an, dass es sich bei dem Feld "comments" um ein genestetes Feld handelt. Das bedeutet es beinhaltet Objekte, die selbst Attribute mit sich bringen. Als nächstes speichere ich noch einmal alle meine Dokumente in diesem Index. Nach dieser Änderung funktioniert allerdings meine ursprüngliche Suchstrategie nicht mehr. Denn bei einer Angabe von "comments.username" und der Suche nach "Christopher" bekomme ich nun gar kein Ergebnis mehr. Denn sobald ich den Typ "nested" definiere muss ich besondere Vorkehrungen bei der Suche treffen. Eine solche Suche gestaltet sich also so. Ich benutze zusätzlich die Angabe "nested" und definiere hier einen Pfad, über den zu meinen Objekten navigiert werden kann. In dem Fall also auf dem Feld "comments". Außerdem definiere ich hier noch einen "score_mode", der üblicherweise als "max" definiert ist. Das bedeutet ich wähle die Dokumente mit dem höchsten Scorewert. Unterhalb von "nested" kann ich nun meinen üblichen "query" definieren, wie bereits vorher geschehen. Also mit "comments.username" und der Angabe "Christopher". Das Ergebnis ist also, wie erwartet und wie bereits vorher. Nehme ich nun meine vorhin nicht alt so intuitive Anfrage und suche zunächst einmal nach 2.1. In dem Fall bekomme ich wieder das korrekte Ergebnis mit "Christopher" der 2.1, als Bewertung angegeben hat. Suche ich nun allerdings nach 2.3 bekomme ich, wie auch erwartet kein Ergebnis. Denn das Dokument für den Kommentar von Christopher hat keine Bewertung, die größer oder gleich 2.3 ist. Auf genestete Felder lassen sich üblicherweise auch Aggregationen anwenden. Wenn ich allerdings den "nested_typ" spezifiziere, funktioniert die Aggregationen nicht korrekt. Stattdessen muss ich, wie im Suchfall zusätzlich das Attribut "nested" innerhalb meiner Aggregation angeben und dort den Pfand zu meinem Objekt spezifizieren. Dann bekomme ich, wie in diesem Beispiel hier den Durchschnittswert aller Bewertungen innerhalb von Kommentaren meiner Filme. Sie haben nun also gesehen, dass das Einfügen von geschachtelten Objekten generell zunächst einmal ohne Komplexität in Elasticsearch funktioniert. Allerdings hatten wir ohne vorherige Konfiguration Probleme dabei, fein granularere Abfragen auf diese genesteten Objekte durchzuführen. Denn diese verhielten sich nicht intuitiv. Deshalb haben wir zusätzlich den Nested-Persistenztypen angegeben. Bereits bei der Definition des Mappings unseres Index. Neben dieser Definition mussten wir dann noch beachten, dass unsere Anfragen zukünftig einen Path angeben müssen, insofern sie auf den genesteten Objekten stattfinden.

Elasticsearch Grundkurs

Lernen Sie, Elasticsearch und seine Einsatzgebiete zu verstehen und mit der API zu interagieren.

2 Std. 19 min (23 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Themen:
Programmierung
Exklusiv für Abo-Kunden
Erscheinungsdatum:23.02.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!