Heim >Web-Frontend >js-Tutorial >Erstellen Sie eine Suchmaschine mit Node.js und Elasticsearch

Erstellen Sie eine Suchmaschine mit Node.js und Elasticsearch

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌Original
2025-02-17 08:47:09922Durchsuche

Build a Search Engine with Node.js and Elasticsearch

Dieser Artikel wurde von Mark Brown, Vildan Softic und Moritz Kröger überprüft. Vielen Dank an alle Peer -Rezensenten bei SitePoint für die perfekte Erstellung von SitePoint -Inhalten!

Elasticsearch ist eine Open -Source -Suchmaschine, die aufgrund ihrer hohen Leistung und verteilten Architektur immer beliebter wird. In diesem Artikel werden die wichtigsten Funktionen untersucht und Ihnen die Verwendung einer Suchmaschine von Node.js erstellen.

Schlüsselpunkte

  • ElasticSearch ist eine hochleistungsfähige verteilte Suchmaschine, die auf Apache Lucene basiert und hauptsächlich für die Echtzeit-Indexierung und -suche verwendet wird.
  • Das System ist musterfrei, kann automatisch Datenstrukturen und -typen erkennen und unterstützt eine große Anzahl von Vorgängen, indem die erholsame API von JSON auf HTTP verwendet wird.
  • Elasticsearch kann mit einem Paketmanager wie ZIP -Dateien oder Homebrew einfach im Hauptbetriebssystem installiert werden und erfordert eine Java -Laufzeitumgebung, die ausgeführt werden muss.
  • node.js 'offizielles Elasticsearch -Modul erleichtert die Integration der Funktionalität von Elasticsearch mit Node.js -Anwendungen und ermöglicht eine effiziente Datenindexierung und Abfrage.
  • Die Schlüsselkonzepte von Elasticsearch umfassen Indexierung, Typen und Suchvorgänge, mit denen komplexe Abfragen, Filter und Aggregationen Daten verfeinert und analysiert werden können.
  • Elasticsearch unterstützt die Echtzeitsuche, was bedeutet, dass die neu indizierten Daten fast sofort durchsucht werden können, wodurch die Reaktionsgeschwindigkeit von Anwendungen verbessert werden, die auf den neuesten Informationen beruhen.
  • Dieses Tutorial enthält praktische Beispiele und Codeausschnitte zum Einrichten von Elasticsearch mit node.js, der Ausführung verschiedener Suchanfragen und der Verwendung erweiterte Funktionen wie Datenaggregation und Vorschläge.

Einführung in Elasticsearch

Elasticsearch ist auf Apache Lucene, einer Hochleistungs-Suchmaschinenbibliothek, aufgebaut. Obwohl Elasticsearch Datenspeicher und Abrufen durchführen kann, besteht der Hauptzweck nicht darin, als Datenbank, sondern als Suchmaschine (Server) zu fungieren, dessen Hauptziel darin besteht, Daten zu indexieren, zu suchen und in Echtzeitstatistiken von Daten bereitzustellen.

Elasticsearch verfügt über eine verteilte Architektur, die eine horizontale Skalierung erzielen kann, indem mehr Knoten hinzugefügt und zusätzliche Hardware nutzt. Es unterstützt Tausende von Knoten, um Petabyte von Daten zu verarbeiten. Die horizontale Skalierung bedeutet auch eine hohe Verfügbarkeit und kann die Daten wieder ausführen, wenn ein Knoten fehlschlägt.

Nach dem Importieren der Daten wird sofort zur Suche verwendet. Elasticsearch ist schemafrei, speichert Daten in JSON-Dokumenten und kann automatisch Datenstrukturen und -typen erkennen.

elasticsearch ist ebenfalls vollständig api angesteuert. Dies bedeutet, dass fast alle Vorgänge über eine einfache API mit JSON -Daten auf HTTP durchgeführt werden können. Es bietet viele Client -Bibliotheken für fast jede Programmiersprache, einschließlich Node.js. In diesem Tutorial werden wir die offizielle Kundenbibliothek verwenden.

Elasticsearch ist in Bezug auf die Hardware- und Softwareanforderungen sehr flexibel. Während die empfohlene Produktionsumgebung 64 GB RAM und so viele CPU-Kerne wie möglich ist, können Sie sie dennoch auf einem ressourcenbezogenen System ausführen und eine anständige Leistung erzielen (vorausgesetzt, Ihr Datensatz ist nicht sehr groß). Um den Beispielen in diesem Artikel zu befolgen, reicht ein System mit 2 GB Speicher und einem einzelnen CPU -Kern aus.

Sie können Elasticsearch auf allen wichtigen Betriebssystemen (Linux, Mac OS und Windows) ausführen. Dazu müssen Sie die neueste Version der Java Runtime -Umgebung installieren (siehe Abschnitt "Installieren von Elasticsearch"). Um den Beispielen in diesem Artikel zu befolgen, müssen Sie auch Node.js (jede Version nach v0.11.0) sowie NPM installieren.

Elasticsearch Terminologie

Elasticsearch verwendet eine eigene Terminologie, die in einigen Fällen von einem typischen Datenbanksystem unterschiedlich ist. Hier finden Sie eine Liste der häufig verwendeten Begriffe und ihre Bedeutungen in Elasticsearch.

Index: Dieser Begriff hat zwei Bedeutungen im Kontext von Elasticsearch. Der erste ist der Betrieb von Daten. Wenn Daten hinzugefügt werden, wird der Text in Tags (wie z. B. Wörter) unterteilt und jedes Tag indiziert. Indexen verweisen jedoch auch auf den Ort, an dem alle Indexdaten gespeichert werden. Wenn Sie die Daten importieren, wird dies im Grunde genommen in einen Index indiziert. Jedes Mal, wenn Sie etwas in Ihren Daten ausführen möchten, müssen Sie den Indexnamen angeben.

Typ: Elasticsearch bietet eine detailliertere Klassifizierung von Dokumenten im Index, genannt Typen. Jedes Dokument im Index sollte auch einen Typ haben. Zum Beispiel können wir einen Bibliotheksindex definieren und dann mehrere Datenarten (z. B. Artikel, Bücher, Berichte und Präsentationen) in die IT indexieren. Da Indizes fast festgelegt sind, wird empfohlen, weniger Indizes und mehr Typen anstelle von weiteren Indizes und weniger Typen zu verwenden.

Suche: Dieser Begriff kann das gleiche bedeuten, wie Sie denken. Sie können nach Daten in verschiedenen Indizes und Typen suchen. Elasticsearch bietet viele Arten von Suchabfragen wie Begriffe, Phrasen, Bereiche, Fuzzy und sogar geografische Datenabfragen.

filter: Elasticsearch können Sie die Suchergebnisse basierend auf verschiedenen Kriterien filtern, um den Ergebnisbereich weiter zu engagieren. Wenn Sie eine neue Suchabfrage zu einer Reihe von Dokumenten hinzufügen, kann sie die Reihenfolge entsprechend der Abhängigkeit ändern. Wenn Sie jedoch dieselbe Abfrage wie Filter hinzufügen, bleibt die Reihenfolge gleich.

Aggregation: Diese liefern verschiedene Arten von Statistiken für aggregierte Daten wie Minimum, Maximum, Durchschnitt, Summe, Histogramm und mehr.

Vorschläge: Elasticsearch bietet verschiedene Arten von Vorschlägen für Eingabetxt. Diese Vorschläge können auf Begriffen oder Phrasen beruhen, und sogar Vorschläge können abgeschlossen werden.

Installieren Sie ElasticSearch

ElasticSearch ist unter der Apache 2 -Lizenz verfügbar; Vor der Installation müssen Sie sicherstellen, dass die Java Runtime Environment (JRE) auf Ihrem Computer installiert ist. Elasticsearch ist in Java geschrieben und hängt von Java -Bibliotheken ab. Um zu überprüfen, ob Java in Ihrem System installiert ist, können Sie Folgendes in die Befehlszeile eingeben.

<code>java -version</code>

Die neueste stabile Version von Java wird empfohlen (1,8 zum Zeitpunkt des Schreibens). Hier finden Sie eine Anleitung zum Installieren von Java in Ihrem System.

Als nächstes finden Sie die neueste Version von Elasticsearch (2.4.0 zum Zeitpunkt des Schreibens), besuchen Sie die Download -Seite und laden Sie die ZIP -Datei herunter. Elasticsearch erfordert keine Installation, und eine einzige Zip -Datei enthält eine vollständige Reihe von Dateien, die Programme auf allen unterstützten Betriebssystemen ausführen. Entpacken Sie die heruntergeladene Datei und sie ist fertig! Es gibt verschiedene andere Möglichkeiten, Elasticsearch auszuführen, z. B. TAR -Dateien oder Pakete für verschiedene Linux -Verteilungen (siehe hier).

Wenn Sie Mac OS X ausführen und Homebrew installieren lassen, können Sie Brew Install Elasticsearch verwenden, um Elasticsarch zu installieren. Homebrew fügt die ausführbare Datei automatisch zu Ihrem Pfad hinzu und installiert die erforderlichen Dienste. Es hilft Ihnen außerdem, Ihre Anwendung mit einem einzigen Befehl zu aktualisieren: Brew Upgrade Elasticsearch.

Ausführen von Elasticsearch unter Windows binelasticsearch.bat aus dem dekomprimierten Verzeichnis. Für alle anderen Betriebssysteme rennen Sie ./Bin/elasticsearch vom Terminal. Zu diesem Zeitpunkt sollte es auf Ihrem System ausgeführt werden.

Wie ich bereits erwähnt habe, kann fast alles, was Sie mit Elasticsearch machen können, über die Rest -API erfolgen. Elasticsearch verwendet standardmäßig Port 9200. Um sicherzustellen, dass Sie es richtig ausführen, besuchen Sie http: // localhost: 9200/in Ihrem Browser, in dem einige grundlegende Informationen zu der von Ihnen ausgeführten Instanz angezeigt werden sollten.

Für weitere Informationen zur Installation und Fehlerbehebung können Sie auf die Dokumentation zugreifen.

Grafische Benutzeroberfläche

Elasticsearch bietet fast alle Funktionen über die Rest -API und verfügt nicht über eine grafische Benutzeroberfläche (GUI). Während ich über die API und den Node.js abgehalten habe, wie alle notwendigen Vorgänge durchgeführt werden, gibt es einige GUI -Tools, die visuelle Informationen zu Indizes und Daten sowie einige erweiterte Analysen liefern.

Kibana, entwickelt von demselben Unternehmen, bietet eine Echtzeitübersicht der Daten sowie einige benutzerdefinierte Visualisierungs- und Analyseoptionen. Kibana ist kostenlos und hat eine detaillierte Dokumentation.

Die Community hat auch andere Tools entwickelt, darunter Elasticsearch-Head, die Elasticsearch-GUI und sogar eine Chrome-Erweiterung namens Elasticsearch Toolbox. Diese Tools können Ihnen dabei helfen, Indexes und Daten in Ihrem Browser zu durchsuchen und sogar verschiedene Suchvorgänge und aggregierte Abfragen auszuprobieren. Alle diese Tools bieten Vorgehensweise für die Installation und Verwendung.

node.js Umgebung

setzen

Elasticsearch bietet ein offizielles Modul für node.js namens ElasticSearch. Zunächst müssen Sie das Modul zu Ihrem Projektordner hinzufügen und die Abhängigkeiten für die zukünftige Verwendung speichern.

<code>npm install elasticsearch --save</code>

Sie können das Modul dann wie folgt in das Skript importieren:

<code>java -version</code>

Schließlich müssen Sie einen Kunden einrichten, der die Kommunikation mit ElasticSearch übernimmt. In diesem Beispiel gehe ich davon aus, dass Sie Elasticsearch auf Ihrem lokalen Computer mit einer IP -Adresse von 127.0.0.1 und einem Port von 9200 (Standardeinstellung) ausführen.

<code>npm install elasticsearch --save</code>
Die Option

Protokoll stellt sicher, dass alle Fehler protokolliert werden. Für den Rest dieses Artikels werde ich dasselbe Esclient -Objekt verwenden, um mit Elasticsearch zu kommunizieren. Die vollständige Dokumentation des Knotenmoduls wird hier bereitgestellt.

Hinweis: Der gesamte Quellcode für dieses Tutorial ist auf GitHub verfügbar. Der einfachste Weg zu folgen ist, das Repository auf Ihren PC zu klonen und das Beispiel von dort aus auszuführen:

<code>const elasticsearch = require('elasticsearch');</code>

Daten importieren

In diesem Tutorial werde ich einen Datensatz mit akademischen Artikeln mit zufällig generierten Inhalten verwenden. Die Daten werden im JSON -Format bereitgestellt, und es gibt 1.000 Artikel im Datensatz. Um den Stil der Daten anzuzeigen, wird unten ein Element im Datensatz angezeigt.

<code>const esClient = new elasticsearch.Client({
  host: '127.0.0.1:9200',
  log: 'error'
});</code>

Der Feldname ist selbsterklärend. Das einzige, was zu beachten ist, ist, dass das Körperfeld hier nicht angezeigt wird, da es ein vollständig zufällig generiertes Dokument (einschließlich 100 bis 200 Absätze) enthält. Hier finden Sie den vollständigen Datensatz.

Während Elasticsearch Methoden zum Indizieren, Aktualisieren und Löschen einzelner Datenpunkte bereitstellt, werden wir die Batch -Methode von Elasticserch zum Importieren von Daten verwenden, die zur Ausführung von Vorgängen auf großen Datensätzen effizienter verwendet werden:

<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git
cd node-elasticsearch-tutorial
npm install</code>

Hier rufen wir die BulkIndex -Funktion auf und übergeben die Bibliothek als Indexname, Artikel als Typ und die JSON -Daten, die wir indexieren möchten. Die BulkIndex -Funktion ruft nacheinander die Bulk -Methode auf dem Esclient -Objekt auf. Diese Methode nimmt ein Objekt mit dem Körperattribut als Parameter auf. Der Wert der Körperbesitz ist ein Array mit zwei Einträgen pro Betrieb. Im ersten Eintrag wird der Typ des Vorgangs als JSON -Objekt angegeben. In diesem Objekt bestimmt die Indexeigenschaft die zu ausgeführte Operation (in diesem Fall das Indexdokument) sowie den Indexnamen, den Typnamen und die Dokument -ID. Der nächste Eintrag entspricht dem Dokument selbst.

Bitte beachten Sie, dass Sie in Zukunft auf diese Weise andere Arten von Dokumenten (z. B. Bücher oder Berichten) demselben Index hinzufügen können. Wir können jedem Dokument auch eine eindeutige ID zuweisen, dies ist jedoch optional. Wenn Sie keine angeben, werden Sie jedem Dokument eine eindeutig generierte ID zuweisen.

Unter der Annahme, dass Sie das Repository geklont haben, können Sie die Daten nun in Elasticsearch importieren, indem Sie den folgenden Befehl aus dem Projektstamm ausführen:

<code>{
    "_id": "57508457f482c3a68c0a8ab3",
    "title": "Nostrud anim proident cillum non.",
    "journal": "qui ea",
    "volume": 54,
    "number": 11,
    "pages": "109-117",
    "year": 2014,
    "authors": [
      {
        "firstname": "Allyson",
        "lastname": "Ellison",
        "institution": "Ronbert",
        "email": "Allyson@Ronbert.tv"
      },
      ...
    ],
    "abstract": "Do occaecat reprehenderit dolore ...",
    "link": "http://mollit.us/57508457f482c3a68c0a8ab3.pdf",
    "keywords": [
      "sunt",
      "fugiat",
      ...
    ],
    "body": "removed to save space"
  }</code>

Überprüfen Sie, ob die Daten korrekt indiziert sind

Ein wichtiges Merkmal von Elasticsearch ist die nahezu reale Suche. Dies bedeutet, dass die Dokumente nach Indexierung innerhalb einer Sekunde verfügbar sind (siehe hier). Sobald die Daten indiziert sind, können Sie die Indexinformationen durch Ausführen von indices.js (mit dem Quellcode verknüpft) überprüfen:

<code class="language-javascript">// index.js

const bulkIndex = function bulkIndex(index, type, data) {
  let bulkBody = [];

  data.forEach(item => {
    bulkBody.push({
      index: {
        _index: index,
        _type: type,
        _id: item.id
      }
    });

    bulkBody.push(item);
  });

  esClient.bulk({body: bulkBody})
  .then(response => {
    console.log('here');
    let errorCount = 0;
    response.items.forEach(item => {
      if (item.index && item.index.error) {
        console.log(++errorCount, item.index.error);
      }
    });
    console.log(
      `Successfully indexed ${data.length - errorCount}
       out of ${data.length} items`
    );
  })
  .catch(console.err);
};

const test = function test() {
  const articlesRaw = fs.readFileSync('data.json');
  bulkIndex('library', 'article', articles);
};</code>

Die Methode im Katzenobjekt des Kunden liefert verschiedene Informationen über die aktuell ausgeführte Instanz. Die Indizesmethode listet alle Indizes, ihre Gesundheit, die Anzahl der Dokumente und ihre Größe auf der Festplatte auf. Die Option V fügt der Antwort der Katzenmethode einen Titel hinzu.

Wenn Sie das obige Code -Snippet ausführen, werden Sie feststellen, dass er einen Farbcode ausgibt, um die Gesundheit des Clusters anzuzeigen. Rot zeigt an, dass es ein Problem mit dem Cluster gibt und nicht ausgeführt wird. Gelb zeigt an, dass der Cluster läuft, aber es gibt eine Warnung, und Grün zeigt an, dass alles in Ordnung ist. Höchstwahrscheinlich (abhängig von Ihren Einstellungen) erhalten Sie einen gelben Zustand, wenn Sie auf Ihrer lokalen Maschine laufen. Dies liegt daran, dass die Standardeinstellungen fünf Knoten des Clusters enthalten, aber nur eine Instanz auf Ihrem lokalen Computer ausgeführt wird. Während Sie immer nach einem grünen Zustand in der Produktion streben sollten, können Sie für die Zwecke dieses Tutorials Elasticsearch weiterhin im gelben Zustand verwenden.

<code>java -version</code>

dynamische und benutzerdefinierte Zuordnung

Wie ich bereits erwähnt habe, ist Elasticsearch musterlos. Dies bedeutet, dass Sie die Struktur der Daten vor dem Import nicht definieren müssen (ähnlich wie bei der Definition einer Tabelle in einer SQL -Datenbank), aber Elasticsearch erkennt sie automatisch für Sie. Obwohl Datenstrukturen als Schemaless bezeichnet werden, haben sie einige Einschränkungen.

Elasticsearch ruft die Struktur der Daten als Mapping auf. Wenn keine Zuordnung vorhanden ist, untersucht Elasticsearch jedes Feld der JSON -Daten bei der Indexierung der Daten und definiert die Zuordnung automatisch anhand ihres Typs. Wenn das Feld bereits einen Zuordnungseintrag hat, stellt es sicher, dass die neuen Daten demselben Format folgen. Andernfalls wirft es einen Fehler auf.

Wenn beispielsweise {"Key11": 12} indiziert wurde, wird Elasticsearch automatisch das Feld Key1 auf Long zugeordnet. Wenn Sie nun versuchen, {"key1": "value1", "key2": "value2"} zu indexieren, wirft er einen Fehler aus, da die Art der Feldschlüssel1 erwartet wird. In der Zwischenzeit wird das Objekt {"key1": 13, "key2": "value2"} ohne Probleme indexiert und der TYP -String wird der Karte hinzugefügt.

Karte liegt außerhalb des Rahmens dieses Artikels, und in den meisten Fällen funktioniert die automatische Kartierung gut. Ich empfehle, die Elasticsearch-Dokumentation zu überprüfen, die eine eingehende Diskussion über Zuordnungen liefert.

Erstellen Sie eine Suchmaschine

Sobald die Daten indiziert sind, können wir Suchmaschinen implementieren. ElasticSearch bietet eine intuitive Abfragestruktur für Volltext-Suchabfragen namens Abfrage DSL -es basiert auf JSON-, um Abfragen zu definieren. Es gibt viele Arten von Suchanfragen, aber in diesem Artikel werden wir einige der häufigsten Abfragen betrachten. Die vollständige Dokumentation für die Abfrage DSL finden Sie hier.

Denken Sie daran, ich habe für jedes hier gezeigte Beispiel einen Code -Link bereitgestellt. Sobald die Umgebung eingerichtet und die Testdaten indiziert sind, können Sie das Repository klonen und alle Beispiele auf Ihrem Computer ausführen. Führen Sie dazu einfach einen Knoten -Dateiname.js aus der Befehlszeile aus.

Geben Sie alle Dokumente in einem oder mehreren Indizes zurück

Um eine Suche durchzuführen, verwenden wir verschiedene vom Client bereitgestellte Suchmethoden. Die einfachste Abfrage ist match_all, die alle Dokumente in einem oder mehreren Indizes zurückgibt. Das folgende Beispiel zeigt, wie wir alle gespeicherten Dokumente im Index erhalten (Link zum Quellcode).

<code>java -version</code>

Die Hauptsuchabfrage ist im Abfrageobjekt enthalten. Wie wir später sehen werden, können wir diesem Objekt verschiedene Arten von Suchanfragen hinzufügen. Für jede Abfrage fügen wir einen Schlüssel hinzu, der den Abfragetyp (Match_all in diesem Beispiel) mit dem Wert des Objekts enthält, das die Suchoptionen enthält. In diesem Beispiel gibt es keine Option, da wir alle Dokumente im Index zurückgeben möchten.

Zusätzlich zum Abfrageobjekt kann der Suchkörper auch andere optionale Eigenschaften enthalten, einschließlich Größe und von. Das Größenattribut bestimmt die Anzahl der Dokumente, die in die Antwort aufgenommen werden sollen. Wenn dieser Wert nicht vorhanden ist, werden standardmäßig zehn Dokumente zurückgegeben. Die Aus -Eigenschaft bestimmt den Startindex des zurückgegebenen Dokuments. Dies ist nützlich für die Paginierung.

Verstehen Sie die Such -API -Antwort

Wenn Sie die Antwort der Such -API aufzeichnen (Ergebnisse im obigen Beispiel), kann sie zunächst kompliziert aussehen, da sie viele Informationen enthält.

<code>npm install elasticsearch --save</code>

Auf höchstem Niveau enthält die Antwort ein Attribut zum Take -Attribut, das die Anzahl der Millisekunden darstellt, die es brauchte, um das Ergebnis Timed_out zu finden, was nur dann zutriff Bereitstellung relevanter Knoteninformationen zum Status (falls als Knotencluster bereitgestellt) und Treffer, die Suchergebnisse enthalten.

In der Eigenschaft Hits haben wir ein Objekt mit den folgenden Eigenschaften:

  • Gesamt - Indiziert die Gesamtzahl der Übereinstimmungen
  • max_score - die höchste Punktzahl für den Element gefunden
  • Hits - Ein Array, das die gefundenen Elemente enthält. In jedem Dokument im Hits -Array haben wir den Index, Typ, Dokument -ID, Score und das Dokument selbst (im Element _Source).

Es ist sehr komplex, aber die gute Nachricht ist, dass Sie, sobald Sie eine Möglichkeit zum Extrahieren der Ergebnisse implementieren, die Ergebnisse immer im selben Format erhalten, unabhängig von Ihrer Suchabfrage.

Beachten Sie auch, dass einer der Vorteile von Elasticsearch darin besteht, jedem übereinstimmenden Dokument automatisch eine Punktzahl zugewiesen. Diese Punktzahl wird verwendet, um die Relevanz des Dokuments zu quantifizieren, und standardmäßig werden die Ergebnisse in der Reihenfolge abnehmender Bewertungen zurückgegeben. In dem Fall, in dem wir Match_all verwenden, um alle Dokumente abzurufen, sind die Punktzahlen keinen Sinn und alle Punkte werden als 1,0 berechnet.

Das Dokument mit einem bestimmten Wert im Feld Match

Schauen wir uns nun einige interessante Beispiele an. Um Dokumente zu entsprechen, die im Feld bestimmte Werte enthalten, können wir die Übereinstimmungsabfrage verwenden. Im Folgenden finden Sie eine einfache Suchbehörde mit einer Übereinstimmungsabfrage (Link zum Quellcode).

<code>const elasticsearch = require('elasticsearch');</code>

Wie ich bereits erwähnt habe, fügen wir zunächst einen Eintrag zu einem Abfragungsobjekt hinzu, das den Suchtyp enthält, und übereinstimmen in diesem Beispiel. Innerhalb des Suchtyp -Objekts identifizieren wir das Feld Dokument, um zu suchen, hier ist der Titel. Darin setzen wir Daten in Bezug auf die Suche, einschließlich des Query -Attributs. Ich hoffe, dass Sie nach dem Testen des obigen Beispiels über die Suchgeschwindigkeit erstaunt sein werden.

Die obige Suchabfrage gibt ein Dokument zurück, dessen Titelfeld jedem Wort im Abfrageattribut übereinstimmt. Wir können die minimale Anzahl von Übereinstimmungen wie unten gezeigt einstellen.

<code>java -version</code>

Diese Abfrage entspricht Dokumenten mit mindestens drei angegebenen Wörtern in ihrem Titel. Wenn die Abfrage weniger als drei Wörter enthält, müssen alle Wörter im Titel angezeigt werden, um dem Dokument zu entsprechen. Eine weitere nützliche Funktion, die zu Suchanfragen hinzugefügt wurde, ist Mehrdeutigkeit. Dies ist nützlich, wenn der Benutzer beim Schreiben einer Abfrage einen Fehler eingibt, da Fuzzy -Übereinstimmungen nach Begriffen mit ähnlichen Schreibweisen suchen. Für Zeichenfolgen basiert der Mehrdeutigkeitswert auf dem maximalen Levinstein -Abstand, der für jeden Begriff zulässig ist. Hier ist ein Beispiel mit Mehrdeutigkeit.

<code>npm install elasticsearch --save</code>

Suche in mehreren Feldern

Wenn Sie in mehreren Feldern suchen möchten, können Sie mit Multi_Match nach Typen suchen. Es ist ähnlich wie bei der Übereinstimmung, außer dass wir, anstatt das Feld als Schlüssel im Suchabfrageobjekt zu verwenden, einen Feldtaste hinzufügen, bei dem es sich um eine Reihe von Feldern handelt. Hier suchen wir im Titel, Autoren.Firstname und Authors.LastName Fields. (Link zum Quellcode)

<code>const elasticsearch = require('elasticsearch');</code>

Multi_Match -Abfrage unterstützt andere Sucheigenschaften wie minimum_should_match und Unschärfe. Elasticsearch unterstützt Wildcards (wie *) mit mehreren Feldern, sodass wir das obige Beispiel für ['Titel', "Autoren. *Name '] verkürzen können.

übereinstimmen mit der vollständigen Phrase

Elasticsearch kann auch die eingegebenen Phrasen genau übereinstimmen, ohne auf der Laufzeit zu entsprechen. Diese Abfrage ist eine Erweiterung einer regulären Match -Abfrage namens Match_Phrase. Hier ist ein Beispiel für match_phrase. (Link zum Quellcode)

<code>const esClient = new elasticsearch.Client({
  host: '127.0.0.1:9200',
  log: 'error'
});</code>

kombiniert mehrere Abfragen

Bisher haben wir im Beispiel nur eine Abfrage pro Anfrage verwendet. Mit Elasticsearch können Sie jedoch mehrere Abfragen kombinieren. Die häufigste zusammengesetzte Abfrage ist Bool. Die Bool -Abfrage akzeptiert vier Arten von Schlüssel: Muss, sollten, Must_Not und Filter. Wie der Name schon sagt, müssen die Dokumente im Ergebnis mit der Abfrage in Must übereinstimmen. Jedes der oben genannten Elemente kann mehrere Abfragen in Form eines Abfragearrays empfangen. unten verwenden wir eine Bool -Abfrage mit einem neuen Abfrage -Typ query_string. Auf diese Weise können Sie fortgeschrittenere Abfragen mit Schlüsselwörtern wie und und und oder schreiben. Die vollständige Dokumentation von Query_String -Syntax finden Sie hier. Darüber hinaus verwenden wir eine Abfrage von Scope (hier dokumentiert), mit der wir Felder auf einen bestimmten Bereich beschränken können. (Link zum Quellcode)

Im obigen Beispiel gibt die Abfrage den Namen des Autors zurück, der Termin1

oder

ihren Nachnamen enthält , 2012 oder im Jahr 2013 veröffentlichte Dokumente. Darüber hinaus erhalten Dokumente, die eine bestimmte Phrase in ihrem Körper enthalten, höhere Punktzahlen und werden oben im Ergebnis angezeigt (da sich die Übereinstimmungsabfrage in der Soll -Klausel befindet).
<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git
cd node-elasticsearch-tutorial
npm install</code>

Filter, Aggregationen und Empfehlungen Zusätzlich zu den erweiterten Suchfunktionen bietet Elasticsearch zusätzliche Funktionen. Hier betrachten wir drei weitere gängige Funktionen.

filter

Normalerweise möchten Sie Ihre Suchergebnisse anhand spezifischer Kriterien verfeinern. Elasticsearch bietet diese Funktionalität über Filter. Nehmen wir in unseren Artikeldaten an, Ihre Suche gibt mehrere Artikel zurück, aus denen Sie nur diejenigen auswählen möchten, die in fünf spezifischen Jahren veröffentlicht wurden. Sie können einfach etwas herausfiltern, das Ihren Kriterien nicht aus Ihren Suchergebnissen übereinstimmt, ohne die Suchreihenfolge zu ändern.

Die Differenz zwischen einem Filter und derselben Abfrage in der Klausel einer Bool -Abfrage besteht darin, dass der Filter die Suchbewertung nicht beeinflusst und die Abfrage die Muss beeinflussen. Wenn die Suchergebnisse zurückgegeben werden und Benutzer basierend auf bestimmten Kriterien filtern, möchten sie nicht die ursprüngliche Ergebnisreihenfolge ändern, sondern nur irrelevante Dokumente aus dem Ergebnis löschen. Filter folgen dem gleichen Format wie Suchvorgänge, aber häufiger werden sie auf Feldern mit bestimmten Werten und nicht auf Textzeichenfolgen definiert. Elasticsearch empfiehlt, Filter über die Filterklausel der Bool Composite -Suchabfrage hinzuzufügen.

Fahren Sie mit dem obigen Beispiel fort und nehmen Sie an, wir möchten unsere Suchergebnisse auf Artikel beschränken, die von 2011 bis 2015 veröffentlicht wurden. Dazu müssen wir nur eine Reichweite zum Filterteil der ursprünglichen Suchabfrage hinzufügen. Dadurch werden alle nicht übereinstimmenden Dokumente aus dem Ergebnis entfernt. Hier ist ein Beispiel für die Filtern von Fragen. (Link zum Quellcode)

<code>java -version</code>

Polymerisation

Das Aggregationsframework liefert verschiedene aggregierte Daten und Statistiken, die auf Suchabfragen basieren. Die beiden Haupttypen der Aggregation sind Metriken und Gruppierung, bei denen die metrischen Aggregation Metriken in einer Reihe von Dokumenten verfolgt und berechnet, während gruppierte Aggregation Eimer erstellt, die jeweils mit einem Schlüssel und einer Dokumentenbedingung zugeordnet sind. Beispiele für die metrische Aggregation sind Mittelwert, Minimum, Maximum, Summe und Wertzahl. Beispiele für gruppierte Aggregation sind Bereiche, Datumsbereiche, Histogramme und Terminologie. Eine eingehende Erklärung des Aggregators finden Sie hier.

Aggregationen werden im Aggregat -Objekt platziert, das selbst direkt im Körper des Suchobjekts platziert ist. Im Aggregat -Objekt ist jeder Schlüssel der vom Benutzer dem Aggregator zugewiesene Name. Der Aggregator -Typ und die Optionen sollten als Wert dieses Schlüssels platziert werden. Als nächstes betrachten wir zwei verschiedene Aggregatoren, einen metrischen Aggregator und einen Eimer -Aggregator. Als metrischer Aggregator versuchen wir, den Mindestjahreswert (ältester Beitrag) im Datensatz zu finden, und für den Bucket -Aggregator versuchen wir, die Anzahl der Vorkommen jedes Schlüsselworts zu finden. (Link zum Quellcode)

<code>npm install elasticsearch --save</code>
Im obigen Beispiel nennen wir den metrischen Aggregator min_year (dieser Name kann ein beliebiger Name sein), was eine Aggregation von min -Typ auf dem Feld des Jahres ist. Der Bucket -Aggregator wird als Schlüsselwörter ausgezeichnet, was eine Aggregation von Begriffen ist, die im Feld Keywords durchgeführt werden. Die Ergebnisse des Aggregats sind im Aggregationselement in der Antwort enthalten und enthalten auf einer tieferen Ebene jeden definierten Aggregator (min_year und Schlüsselwörter hier) und deren Ergebnisse. Hier ist eine teilweise Antwort auf dieses Beispiel.

<code>const elasticsearch = require('elasticsearch');</code>
standardmäßig werden in der Antwort bis zu 10 Eimer zurückgegeben. In der Anforderung können Sie eine Größenschlüssel neben dem Feld hinzufügen, um die maximale Anzahl der zurückgegebenen Eimer zu bestimmen. Wenn Sie alle Eimer empfangen möchten, setzen Sie diesen Wert auf 0.

Vorschläge

Elasticsearch verfügt über mehrere Arten von Vorschlägen, die Ersatz- oder Fertigstellung Vorschläge für Eingabebedingungen erstellen können (hier dokumentiert). Wir werden hier den Begriff und den Ausdrucksvorschlag überprüfen. Der Begriff Vorschlag gibt Ratschläge für jeden Begriff im Eingabtext (falls vorhanden), während der Phrase -Sugester den Eingabetxt als vollständige Phrase behandelt (anstatt ihn in Begriffe aufzuteilen) und andere Phrasenvorschläge (falls vorhanden) liefert. Um die Vorschlag -API zu verwenden, müssen wir die Vorschlag -Methode im Node.js -Client aufrufen. Hier ist ein Beispiel für einen Begriff Vorschlag. (Link zum Quellcode)

<code>java -version</code>

In der Anforderungsorganisation, die mit allen anderen Client -Methoden übereinstimmt, haben wir ein Indexfeld, das den Index der Suche bestimmt. In der Body -Eigenschaft fügen wir den Text hinzu, den wir nach Vorschlägen suchen, und (wie beim Aggregatobjekt) weisen wir jedem Vorschlag einen Namen zu (in diesem Fall titlesughester). Sein Wert bestimmt den Typ und die Optionen des Vorschlags. In diesem Fall verwenden wir einen Term Sughtester für das Titelfeld und begrenzen die maximale Anzahl von Vorschlägen pro Tag auf fünf (Größe: 5).

Die Antwort der Vorschlag -API enthält einen Schlüssel für jeden Vorschlag, den Sie anfordern. Dies ist ein Array von Größen, die der Anzahl der Begriffe im Textfeld entsprechen. Für jedes Objekt in diesem Array gibt es ein Optionsobjekt, dessen Textfeld Vorschläge enthält. Das Folgende ist eine teilweise Antwort auf die obige Anfrage.

<code>npm install elasticsearch --save</code>
Um Phrasenvorschläge zu erhalten, können wir dasselbe Format wie oben befolgen. Ersetzen Sie einfach den Vorschlagtyp durch die Phrase. Im folgenden Beispiel folgt die Antwort demselben Format wie oben erläutert. (Link zum Quellcode)

<code>const elasticsearch = require('elasticsearch');</code>

Weitere Lesen

Elasticsearch bietet eine breite Palette von Funktionen, die weit über den Rahmen dieses Artikels hinausgehen. In diesem Artikel versuche ich, seine Funktionalität auf hoher Ebene zu erklären und auf geeignete Ressourcen für weiteres Lernen zu verweisen. Elasticsearch ist sehr zuverlässig und hat eine hervorragende Leistung (ich hoffe, Sie haben dies beim Ausführen der Beispiele bemerkt). Dies, verbunden mit wachsender Unterstützung der Gemeinschaft, erhöht die Akzeptanz von Elasticsearch in der Branche, insbesondere bei Unternehmen, die Echtzeitdaten oder Big Data verarbeiten.

Nachdem Sie die hier angegebenen Beispiele sorgfältig gelesen haben, empfehle ich Ihnen dringend, die Dokumentation zu überprüfen. Sie bieten zwei Hauptquellen, einer ist ein Hinweis auf Elasticsarch und seine Funktionen, und der andere ist ein Leitfaden, der sich mehr auf Implementierung, Anwendungsfälle und Best Practices konzentriert. Hier finden Sie auch eine detaillierte Dokumentation für den Node.js -Client.

Verwenden Sie bereits Elasticsearch? Was ist Ihre Erfahrung? Oder planen Sie, es nach dem Lesen auszuprobieren? Bitte lassen Sie es mich in den Kommentaren unten wissen.

FAQs (FAQ) über Suchmaschinenknoten Elasticsearch

Was ist der Unterschied zwischen Elasticsearch und anderen Suchmaschinen (wie Elasticlunr oder Minisarch)?

Elasticsearch ist eine leistungsstarke, verteilte und Open -Source -Such- und Analyse -Engine. Es wurde entwickelt, um große Datenmengen zu verarbeiten und Suchergebnisse in Echtzeit bereitzustellen. Auf der anderen Seite sind Elasticlunr und MiniSearch leichte Client -Suchbibliotheken für JavaScript. Sie sind für kleinere Datensätze ausgelegt und werden häufig in browserbasierten Anwendungen verwendet. Während Elasticsearch erweiterte Funktionen wie verteilte Suche, Datenanalysen und Funktionen für maschinelles Lernen anbietet, sind Elasticlunr und Minisearch einfacher für grundlegende Suchfunktionen zu verwenden.

So implementieren Sie Elasticsearch in Node.js -Anwendung?

Die Implementierung von Elasticsearch in Node.JS -Anwendung umfasst mehrere Schritte. Zunächst müssen Sie das Elasticsearch -Paket mit NPM installieren. Anschließend müssen Sie eine Elasticsearch -Client -Instanz erstellen und an Ihren Elasticsearch -Server verbinden. Danach können Sie die Methoden des Kunden verwenden, um verschiedene Aktionen auszuführen, z. B. das Indizieren von Dokumenten, die Suche nach Daten und die Verwaltung Ihres Elasticsearch -Clusters.

Kann ich mit Elasticsearch eine Suchmaschine in meinem Browser erstellen?

Während Elasticsearch hauptsächlich für serverseitige Anwendungen ausgelegt ist, kann es in Browser-basierten Anwendungen mithilfe von Node.js-Server verwendet werden. Der Server kann als Proxy zwischen dem Browser und dem Elasticsearch -Server fungieren und alle Suchanforderungen und Antworten bearbeiten. Für einfachere Anwendungsfälle könnte eine Client -Suchbibliothek wie Elasticlunr oder Minisearch eine bessere Wahl sein.

Wie ist Elasticsearch im Vergleich zu anderen NPM -Suchpaketen?

Elasticsearch ist dank seiner leistungsstarken Funktionen und der Skalierbarkeit eines der beliebtesten Suchpakete auf NPM. Es bietet einen umfassenden APIs für die Indizierung, Suche und Analyse von Daten. Es ist jedoch komplexer und ressourcenintensiver als andere NPM-Suchpakete. Wenn Sie an einem kleinen Projekt arbeiten oder einfache Suchfunktionen benötigen, sind andere NPM-Pakete wie Such-Index oder JS-Search möglicherweise besser geeignet.

Wie erstellt ich eine einfache In-Browser-Suchmaschine mit JavaScript?

Erstellen einer einfachen In-Browser-Suchmaschine mit JavaScript enthält das Erstellen von Datenindizes, die Implementierung von Suchfunktionen und das Anzeigen von Suchergebnissen. Sie können diesen Prozess mithilfe von JavaScript -Suchbibliotheken wie Elasticlunr oder MiniSearch vereinfachen. Diese Bibliotheken bieten eine benutzerfreundliche APIs zur Index- und Durchsuchung von Daten und können direkt im Browser ohne Serveranforderungen verwendet werden.

Was sind die Vorteile der Verwendung von Elasticsearch für die Suche in meiner App?

Elasticsearch bietet viele Vorteile für die Implementierung von Suchfunktionen in Ihrer Anwendung. Es liefert Echtzeit-Suchergebnisse, was bedeutet, dass das Dokument nach dem Index durchsucht werden kann. Es unterstützt auch komplexe Suchanfragen und ermöglicht es Ihnen, Daten basierend auf mehreren Kriterien zu durchsuchen. Darüber hinaus ist Elasticsearch sehr skalierbar und kann große Datenmengen ohne Auswirkungen auf die Leistung bewältigen.

Wie behandelt Elasticsearch die Datenindexierung?

Elasticsearch verwendet eine Datenstruktur, die als invertierte Indizierung für die Datenindexierung bezeichnet wird. Auf diese Weise kann es schnell Dokumente finden, die mit der Suchabfrage übereinstimmen. Wenn ein Dokument indiziert ist, analysiert Elasticsearch den Inhalt und erstellt eine Liste eindeutiger Wörter und speichert dann die Wörter im umgekehrten Index zusammen mit Informationen zu ihrer Position im Dokument.

Kann ich Elasticsearch für die Datenanalyse verwenden?

Ja, Elasticsearch ist nicht nur eine Suchmaschine, sondern auch ein leistungsstarkes Datenanalyse -Tool. Es unterstützt die Aggregation und ermöglicht es Ihnen, Ihre Daten auf verschiedene Weise zu aggregieren und zu analysieren. Sie können Elasticsearch verwenden, um komplexe Datenanalyseaufgaben wie die Berechnung der Mittelwerte, der Summe oder der Anzahl, der Ermittlung von minimalen oder maximalen Werten, Gruppierungsdaten basierend auf bestimmten Bedingungen und mehr auszuführen.

Ist Elasticsearch für Big -Data -Anwendungen geeignet?

Ja, ElasticSearch ist für Big -Data -Anwendungen ausgelegt. Es handelt sich um ein verteiltes System, was bedeutet, dass es horizontal skalieren kann, indem mehr Knoten zum Cluster hinzugefügt werden. Dies ermöglicht es ihm, große Datenmengen zu verarbeiten und schnelle Suchergebnisse auch unter starken Lasten zu liefern. Darüber hinaus unterstützt Elasticsearch Sharding und Replikation, was seine Skalierbarkeit und Zuverlässigkeit weiter verbessert.

Wie optimieren Sie die Leistung von Elasticsearch -Anwendungen?

Es gibt verschiedene Möglichkeiten, die Leistung Ihrer Elasticsearch -Anwendung zu optimieren. Zunächst sollten Sie den Elasticsearch -Cluster korrekt konfigurieren, einschließlich der Anzahl der Knoten, Scherben und Repliken. Zweitens sollten Sie den Indexierungsprozess mithilfe der Batch -Indexierung, der Deaktivierung von Aktualisierungen und dem richtigen Analysator optimieren. Schließlich sollten Sie Ihre Suchanfragen optimieren, indem Sie Filter anstelle von Abfragen so weit wie möglich verwenden, schwere Aggregationen vermeiden und die API "Erklären" verwenden, um zu verstehen, wie die Abfrage ausgeführt wird.

Das obige ist der detaillierte Inhalt vonErstellen Sie eine Suchmaschine mit Node.js und Elasticsearch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn