Zwei sehr wichtige Konzepte in Elasticsearch sind Dokumente und Indizes.
Ein Dokument ist eine Sammlung von Feldern mit ihren zugehörigen Werten. Um mit Elasticsearch arbeiten zu können, müssen Sie Ihre Daten in Dokumente organisieren und anschließend alle Dokumente einem Index hinzufügen. Man kann sich einen Index als eine Sammlung von Dokumenten vorstellen, die in einem hochoptimierten Format gespeichert ist, das für effiziente Suchvorgänge ausgelegt ist.
Wenn Sie bereits mit anderen Datenbanken gearbeitet haben, wissen Sie vielleicht, dass viele Datenbanken eine Schemadefinition erfordern. Diese ist im Wesentlichen eine Beschreibung aller Felder, die Sie speichern möchten, und ihrer Datentypen. Ein Elasticsearch-Index kann bei Bedarf mit einem Schema konfiguriert werden, er kann das Schema aber auch automatisch aus den Daten selbst ableiten. In diesem Abschnitt überlassen Sie Elasticsearch die Schemaerstellung, was für einfache Datentypen wie Text, Zahlen und Datumsangaben sehr gut funktioniert. Später, nachdem Sie mit komplexeren Datentypen vertraut gemacht wurden, lernen Sie, wie man explizite Schemadefinitionen bereitstellt.
Index erstellen
So erstellen Sie einen Elasticsearch-Index mithilfe der Python-Clientbibliothek:
In diesem Beispiel ist self.es eine Instanz der Klasse Elasticsearch , die in diesem Tutorial in der Klasse Search in search.py gespeichert ist. Eine Elasticsearch-Bereitstellung kann verwendet werden, um mehrere Indizes zu speichern, die jeweils durch einen Namen wie my_documents im obigen Beispiel identifiziert werden.
Indizes können auch gelöscht werden:
Wenn Sie versuchen, einen Index mit einem Namen zu erstellen, der bereits einem bestehenden Index zugewiesen ist, erhalten Sie eine Fehlermeldung. Manchmal ist es nützlich, einen Index zu erstellen und dabei automatisch eine vorherige Instanz des Index zu löschen, falls diese existiert. Dies ist besonders nützlich bei der Entwicklung einer Anwendung, da Sie den Index wahrscheinlich mehrmals neu generieren müssen.
Fügen wir eine create_index() Hilfsmethode in search.py hinzu. Öffnen Sie diese Datei in Ihrem Code-Editor und fügen Sie am Ende den folgenden Code ein, wobei der vorhandene Inhalt unverändert bleibt:
Die Methode create_index() löscht zuerst einen Index mit dem Namen my_documents. Die Option ignore_unavailable=True verhindert, dass dieser Aufruf fehlschlägt, wenn der Indexname nicht gefunden wird. Die folgende Zeile in der Methode erzeugt einen brandneuen Index mit demselben Namen.
Die in diesem Tutorial vorgestellte Beispielanwendung benötigt einen einzigen Elasticsearch-Index und legt daher den Indexnamen fest als my_documents fest. Bei komplexeren Anwendungen, die mehrere Indizes verwenden, sollten Sie erwägen, den Indexnamen als Argument zu akzeptieren.
Dokumente zum Index hinzufügen
In der Elasticsearch-Clientbibliothek für Python wird ein Dokument als Wörterbuch von Schlüssel/Wert-Feldern dargestellt. Felder mit einem Zeichenkettenwert werden automatisch für die Volltext- und Stichwortsuche indiziert. Neben Zeichenketten können Sie aber auch andere Feldtypen wie Zahlen, Datumsangaben und Boolesche Werte verwenden, die ebenfalls für effiziente Operationen wie das Filtern indiziert werden. Sie können auch komplexe Datenstrukturen erstellen, in denen ein Feld auf eine Liste oder ein Wörterbuch mit Unterelementen gesetzt wird.
Um ein Dokument in einen Index einzufügen, wird die index() -Methode des Elasticsearch-Clients verwendet. Zum Beispiel:
Der Rückgabewert der Methode index() ist die Antwort, die vom Elasticsearch-Dienst zurückgegeben wird. Die wichtigste Information in dieser Antwort ist ein Element mit dem Schlüsselnamen _id, der die eindeutige Kennung darstellt, die dem Dokument beim Einfügen in den Index zugewiesen wurde. Mithilfe der Kennung kann das Dokument abgerufen, gelöscht oder aktualisiert werden.
Nachdem Sie nun wissen, wie man ein Dokument einfügt, fahren wir mit dem Aufbau einer Bibliothek nützlicher Hilfsfunktionen in search.py fort. mit einer neuen insert_document() Methode für die Search Klasse. Fügen Sie diese Methode am Ende von search.py hinzu:
Die Methode akzeptiert den Elasticsearch-Client und ein Dokument vom Aufrufer, fügt das Dokument in den Index my_documents ein und gibt die Antwort des Dienstes zurück.
HINWEIS: Diese Operationen werden in diesem Tutorial nicht behandelt, aber der Elasticsearch-Client kann auch Dokumente ändern und löschen. In der Dokumentation der Python-Bibliothek finden Sie die Elasticsearch-Klassenreferenz, um mehr über alle verfügbaren Operationen zu erfahren.
Einlesen von Dokumenten aus einer JSON-Datei
Beim Einrichten eines neuen Elasticsearch-Index müssen Sie wahrscheinlich eine große Anzahl von Dokumenten importieren. Für dieses Tutorial enthält das Starterprojekt eine data.json- Datei mit einigen Daten im JSON-Format. In diesem Abschnitt erfahren Sie, wie Sie alle in dieser Datei enthaltenen Dokumente in den Index importieren.
Die Struktur der in der data.json enthaltenen Dokumente ist wie folgt:
name: der Dokumenttitelurl: eine URL zu dem auf einer externen Website gehosteten Dokumentsummary: eine kurze Zusammenfassung des Inhalts des Dokumentscontent: der Hauptteil des Dokumentscreated_onErstellungsdatumupdated_at: Aktualisierungsdatum (kann fehlen, wenn das Dokument nie aktualisiert wurde)category: die Kategorie des Dokuments, diegithub,sharepointoder sein kannteamsrolePermissions: eine Liste der Rollenberechtigungen
An dieser Stelle empfiehlt es sich, die Datei data.json in Ihrem Editor zu öffnen, um sich mit den Daten vertraut zu machen, mit denen Sie arbeiten werden.
Im Wesentlichen ist das Importieren einer großen Anzahl von Dokumenten dasselbe wie das Importieren eines einzelnen Dokuments innerhalb einer For-Schleife. Um den gesamten Inhalt der Datei data.json zu importieren, könnten Sie beispielsweise so vorgehen:
Dieser Ansatz funktioniert zwar, ist aber nicht gut skalierbar. Wenn Sie eine sehr große Anzahl von Dokumenten einfügen müssten, müssten Sie entsprechend viele Aufrufe an den Elasticsearch-Dienst durchführen. Leider ist jeder API-Aufruf mit einem gewissen Leistungsverlust verbunden, und der Dienst verfügt zudem über Ratenbegrenzungen, die verhindern, dass eine große Anzahl von Aufrufen sehr schnell erfolgen kann. Aus diesen Gründen empfiehlt es sich, die Funktion zum Masseneinfügen des Elasticsearch-Dienstes zu nutzen, die es ermöglicht, mehrere Operationen in einem einzigen API-Aufruf an den Dienst zu übermitteln.
Die unten gezeigte insert_documents() -Methode, die Sie am Ende von search.py hinzufügen sollten, verwendet die bulk() -Methode, um alle Dokumente in einem einzigen Aufruf einzufügen:
Die Methode akzeptiert eine Liste von Dokumenten. Anstatt jedes Dokument einzeln hinzuzufügen, erstellt es eine einzige Liste namens operations und übergibt diese Liste dann an die Methode bulk() . Für jedes Dokument werden zwei Einträge zur Liste operations hinzugefügt:
- Eine Beschreibung der auszuführenden Operation, gesetzt auf
index, wobei der Name des Index als Argument angegeben wird. - Die tatsächlichen Daten des Dokuments
Bei der Verarbeitung einer Massenanfrage durchläuft der Elasticsearch-Dienst die Operationsliste von Anfang an und führt die angeforderten Operationen aus.
Neugenerierung des Index
Während Sie dieses Tutorial durcharbeiten, müssen Sie den Index mehrmals neu generieren. Um diesen Vorgang zu vereinfachen, fügen Sie eine reindex() -Methode zu search.py hinzu:
Diese Methode kombiniert die zuvor erstellten Methoden create_index() und insert_documents() , sodass mit einem einzigen Aufruf der alte Index (falls vorhanden) zerstört und ein neuer Index erstellt und neu befüllt werden kann.
HINWEIS: Bei der Indizierung einer sehr großen Anzahl von Dokumenten empfiehlt es sich, die Dokumentenliste in kleinere Gruppen aufzuteilen und jede Gruppe separat zu importieren.
Um diese Methode einfacher aufrufen zu können, machen wir sie über den Befehl flask zugänglich. Öffnen Sie app.py in Ihrem Code-Editor und fügen Sie die folgende Funktion am Ende hinzu:
Der Dekorator @app.cli.command() weist das Flask-Framework an, diese Funktion als benutzerdefinierten Befehl zu registrieren, der dann unter flask reindex verfügbar sein wird. Der Name des Befehls wird vom Funktionsnamen abgeleitet, und der Docstring ist hier enthalten, weil Flask ihn in der --help -Dokumentation verwendet.
Die Antwort der Funktion reindex() , die wiederum die Antwort der Methode bulk() des Elasticsearch-Clients ist, enthält einige nützliche Elemente, die zur Erstellung einer aussagekräftigen Statusmeldung verwendet werden können. Insbesondere ist response['took'] die Dauer des Aufrufs in Millisekunden, und response['items'] ist eine Liste der einzelnen Ergebnisse jeder Operation, die zwar nicht direkt nützlich ist, aber deren Länge die Anzahl der eingefügten Dokumente angibt.
Sehen Sie sich das an, indem Sie flask --help in einer Terminal-Sitzung ausführen und sicherstellen, dass die virtuelle Python-Umgebung aktiviert ist (falls in Ihrer Terminal-Sitzung noch die Flask-Anwendung läuft, können Sie ein zweites Terminalfenster öffnen). Gegen Ende des Hilfebildschirms sollte die Option reindex als verfügbarer Befehl zusammen mit anderen Optionen des Flask-Frameworks aufgeführt sein:
Wenn Sie nun einen sauberen Index generieren möchten, müssen Sie lediglich flask reindex ausführen.
Nächste
Grundlagen der Suche