Vor einiger Zeit hatte ich vor, einen einfachen Suchdienst für das Projekt zu erstellen. Obwohl die Business Database MongoDB Textsuche unterstützt, ist ES offensichtlich eher als Suchmaschine geeignet (obwohl die meisten von uns die Analyse- und Visualisierungsfunktionen von ELK verwendet haben). Elasticsearch basiert auf Lucene und unterstützt extrem schnelle Abfragen und eine reiche Abfrage -Syntax und dient gelegentlich als leichtes NoSQL. Die Fähigkeit zu komplexen Abfragen und Aggregationsoperationen ist jedoch nicht sehr stark.
In diesem Artikel wird nicht erwähnt, wie er einen einfachen Suchdienst erstellt, sondern mehrere Fallstricke aufzeichnen, die während der Arbeitszeit von etwa einer Woche auftreten. .
Warum Elasticsearch 5.x wählen?
Der neue Dienst hat keine historische Belastung und sollte theoretisch den neuesten 6.x verwenden. Springdata-Elasticsearch unterstützt jedoch nur 5.x, und es ist schwierig, eine API-Schicht direkt zu verkapulieren, selbst wenn die Zeit eng ist. Es liegt auch daran, dass die vorherige Version von Elks Zeug verwirrt war, also hatte es keine andere Wahl, als von 2.x bis 5.x zu gehen. Fragen Sie den Unterschied zwischen 5.x und 2.x. Einfach ausgedrückt, es ist Scheibenraum -50%, Indexzeit -50%, Abfrageleistung +25%.
Da die Springdata-Elasticsearch auf 3.0,7 verbessert werden muss, muss die Frühling auf 2.x verbessert werden, was direkt zu den Fallen führt, die später getroffen werden.
Docker Installation ES wird standardmäßig das X-PAD-Plugin installiert
Obwohl die Frühlingsdaten ES5.x unterstützt, sind seine Funktionen nicht sehr vollständig. Daher muss org.elasticsearch.client: X-Pack-Transport: 5.5.0 eingeführt werden, wenn das X-PADH-Plug-In installiert ist. Die Version muss mit der ES -Version übereinstimmen, und Sie können Transportclient selbst wie folgt implementieren
@ComponentPublic Class Esconfig {@Bean public transportclient ctransportclient () löst UnbekannteHostException aus {transportclient client = new PrebuiltxpacktransportClient (setts.builder () .put ("cluster.name", "docer-cluster") .put ("Xpack.Security.USER.USER. .AddtransportAddress (New InetSocketTransportAddress (Inetaddress.GetByName ("0.0,0,0"), 9300)); Kunden zurückgeben; }}Dies ist auch eine schnellere Lösung, die ausgewählt wurde, da ich nicht zu Docker gehen möchte, um mit dem X-PAH-Plug-In umzugehen. Wenn es unnötig ist, muss ich vorerst einige Dinge in ES selbst nicht berühren.
MQ speichert die Klasseninformationen der Nachricht, wodurch sich der Deserialized fehlschlägt
Rabbitmq im Titel wurde noch nie erwähnt, da es nur als Nachrichtenwarteschlange verwendet wird. Wenn sich die Daten ändert, wird die Nachrichten -ID in MQ und der Verbraucher im Suchdienst verbraucht.
Das Problem ist, dass, wenn die Nachricht in MQ geworfen wird, in ein eigenes Objekt eingekapselt ist, wodurch die Rabbittemplate.receivEandConvert zu fehlschlägt, da die Nachricht die Objektpaketinformationen trägt. In der Verzweiflung kann der Verbraucher die Nachrichten -Bytes in der Warteschlange nur direkt erhalten und das JSON -Formular unter Verwendung der ObjectMapper.readValue -Methode in ein Objekt umwandeln.
Die Gradle -Konfiguration kann -doader.main verwenden, um die Startfunktion anzugeben
Gerade weil MQ eingeführt wird, muss der Suchdienst einen Verbraucher gründen. Die Methode besteht darin, eine Anwendung zu implementieren, die den Webdienst nicht startet und einen Simplemessagelistenercontainer und MessagelistenerAdapter wie folgt konfigurieren:
@Bean SimpleMessagelistenerContainer -Container (ConnectionFactory Connectory Factory, Messagelisteneradapter ListenerAdapter, MQConfig -Eigenschaften) {SimpleMessagelistenerContainer Container = new SimpleMessagelistenContainer (); Container.SetConnectionFactory (ConnectionFactory); Container.SetqueueNames (Eigenschaften.getQueuename ()); Container.SetMessagelistener (ListenerAdapter); Rückkehrbehälter; } @Bean MessagelistenerAdapter louserAdapter () {MessagelistenerAdapter ListenerAdapter = new MessagelistenerAdapter (itemconsumer, "consion"); Return Listeneradapter; } Das Problem ist, dass ich bei der Gradle -Konfiguration lange gesucht habe, um das mit dem angegebene -doader.main erstellte JAR -Paket zu erstellen, um die Startanwendung anzugeben. Die Lösung lautet wie folgt:
Fügen Sie in xxx.gradle -Datei hinzu
Bootjar {Manifest {Attribute 'Main-Class': 'org.springframework.boot.loader.propertieSlauncher'}} '}}Im Springboot 1.5.9 -Projekt müssen Sie die Startanwendung angeben und sie hinzufügen
Springboot {layout = "Zip"}Die Möglichkeit zu überprüfen, ob es effektiv ist, besteht darin, das JAR-Paket nach dem Erstellen direkt zu entpacken und in XXX (Projektname)/meta-info/manifest.mf zu überprüfen.
Hauptklasse: org.springframework.boot.loader.PropertieSlauncher
Dann korrekt, wenn
Hauptklasse: org.springframework.boot.loader.jarlauncher
Die Startklasse in der Datei wird weiterhin gestartet
ES kann die Zuordnung von Index nicht ändern
Da es lediglich die Funktionssuchfunktion von ES verwendet, gibt es viele unbefriedigende Suchergebnisse in tatsächlichen Anwendungen, z. B. nach "Schreibtisch", und es ist unmöglich, nach Inhalten wie "Computer Desk/Office Desk" und anderen XX -Tabellen zu suchen. Auf diese Weise gibt es viele Fälle. Daher wird ein Synonym -Wörterbuch hinzugefügt, und der Segmentierer von IK_Smart wird nicht in den Feldern verwendet, die eine Wortsegmentierung erfordern, daher muss die Zuordnung einiger Felder geändert werden
// Analyzer ist ein eigener Wortsegmentierername @field (type = fieldType.text, Index = true, Analyzer = "Synconym") private Zeichenfolge Beschreibung;
Da ES 'Mapping nicht geändert werden kann, können Sie nur manuell eine neue Zuordnung erstellen und dann mit der REINDEX -Methode die Daten nachverfüllen (ES5.x wird mit Reindedex -API geliefert). Es gibt eine Methode online über Alias. In einigen Änderungsszenarien können Sie die Zuordnung reibungslos ändern, ohne die Anwendung neu zu starten/bereitzustellen. Sie können nach Details abfragen und verstehen.
Das obige sind fast die Fallstricke, die von einem Suchdienst berührt wurden. Einige von ihnen haben viel Zeit und Energie verbraucht, um zu lösen. Ich hoffe, es wird für diese Liste einen Referenzwert sein. In Zukunft wird es einige Optimierungen im Suchdienst geben und weiterhin langsam aktualisiert werden. Ich hoffe auch, dass jeder wulin.com mehr unterstützt.