Die Verwendung von ES in MySQL und PHP

coldplay.xixi
Freigeben: 2023-04-09 14:48:01
nach vorne
4329 Leute haben es durchsucht

Ees-Einführung 高 Eine Open-Source-Volltext-Retrieval- und Analyse-Engine mit hoher Erweiterung, die große Datenmengen schnell in Echtzeit speichern, durchsuchen und analysieren kann. Die Verwendung von ES in MySQL und PHPVolltextabfrage bedeutet, dass das Computerindizierungsprogramm einen Index für jedes Wort erstellt, indem es jedes Wort im Artikel scannt und die Nummer und Position des Wortes im Artikel angibt. Wenn der Benutzer eine Abfrage durchführt, verwendet das Abrufprogramm die Vor-. etablierte Index-Suchmethode und geben die Suchergebnisse an den Benutzer zurück. Dieser Vorgang ähnelt dem Nachschlagen eines Wortes über die Suchwortliste in einem Wörterbuch. Volltextsuche von Daten in der Suchmaschinendatenbank

Warum ist ES schneller als MySQL? MySQL verfügt nur über die Begriffswörterbuchschicht, die in B-Tree-Sortierung auf der Festplatte gespeichert wird. Das Abrufen eines Begriffs erfordert mehrere Festplattenoperationen mit wahlfreiem Zugriff. Lucene fügt dem Begriffswörterbuch einen Begriffsindex hinzu, um das Abrufen zu beschleunigen. Der Begriffsindex wird in Form eines Baums im Speicher zwischengespeichert. Nachdem wir den Blockspeicherort des entsprechenden Begriffswörterbuchs aus dem Begriffsindex ermittelt haben, gehen wir dann auf die Festplatte, um den Begriff zu finden, wodurch die Anzahl der Direktzugriffe auf die Festplatte erheblich reduziert wird. Außerdem: Der Termindex wird in Form von FST (Finite State Transducer) im Speicher abgelegt, was sehr speichersparend ist. Das Begriffswörterbuch wird in Blöcken auf der Festplatte gespeichert, indem ein gemeinsames Präfix verwendet wird. Wenn beispielsweise alle Wörter mit Ab beginnen, kann Ab weggelassen werden. Auf diese Weise kann das Begriffswörterbuch mehr Speicherplatz einsparen als B-Tree.


Synchronisierte Datenbank

Wir verwenden MySQL für die Datenspeicherung, verwenden die Transaktionsfunktionen von MySQL, um die Datenkonsistenz aufrechtzuerhalten, und verwenden ElasticSearch für die Datenerfassung und -abfrage. Zu diesem Zeitpunkt ist die Synchronisierungslösung zwischen es und der Datenbank besonders wichtig.

Prozess

Fügen Sie das Produkt zuerst zur Datenbank hinzu. Nach dem erfolgreichen Hinzufügen des Produkts wird das Produkt in ES eingegeben. Wenn der Eintrag in ES fehlschlägt, wird die fehlgeschlagene Produkt-ID in die Redis-Cache-Warteschlange gestellt Die Produkt-ID wird in die Protokolldatei eingegeben (wenn ein Redis-Hang auftritt). Wenn die Produkt-ID verloren geht, können Sie die abnormale Produkt-ID aus dem Protokoll abrufen und sie dann in ES eingeben. Die Aufgabenaufgabe aktualisiert die Redis-Cache-Warteschlange alle Zweitens: Wenn die Produkt-ID aus der Cache-Warteschlange abgerufen wird, werden die Produktdaten entsprechend der Produkt-ID aus der Datenbank abgerufen und dann in ES eingegeben.

Verwenden Sie das Plug-in

logstash-input-jdbc, um die Datenbank, Installation und Konfiguration zu synchronisieren: Erstellen Sie eine .conf-Datei, konfigurieren Sie die zu synchronisierende Datenbank und die .sql-SQL-Anweisung für die Ausführung und fügen Sie schließlich einen JDBC-Treiber ein In diesen Ordner. Wird als Nächstes verwendet, um eine Verbindung zur MySQL-Datenbank herzustellen Der Wert von „tracking_column“ ist „@timestamp“. Er ist die Zeit, zu der logstash in „elasticsearch“ gespeichert wird. Die Hauptfunktion dieses Werts ähnelt dem Primärschlüssel von MySQL Tatsächlich ändern wir uns ständig, daher werden die mit der SELECT-Anweisung abgefragten Daten jedes Mal in Elasticsearch gespeichert, was zu einer Duplizierung der Daten führt.

Lösung

Suchen Sie in der abzufragenden Tabelle den Primärschlüssel oder das Feld für die automatische Inkrementierung und setzen Sie ihn auf den Wert von _id. Da der _id-Wert eindeutig ist, sind die Daten nicht vorhanden, wenn eine doppelte _id vorhanden ist wiederholt

Häufige Datensynchronisierung wirkt sich auf die Leistung der MySQL-Datenbank aus

Die MySQL-Anweisungen, die wir in die Datei jdbc.sql schreiben, sind hartcodiert, sodass viele der Datenbanken, die jedes Mal abgefragt werden, nicht abgefragt werden müssen, insbesondere nicht jedes Mal Bei der Auswahl * aus Tabelle;, es übt großen Druck auf die MySQL-Datenbank aus

Lösung:

(1) Je nach Geschäftsbedarf kann die geplante Synchronisationszeit entsprechend geändert werden. Ich habe hier relativ hohe Echtzeitanforderungen 10-Minuten-Zeitplan festlegen => „*/10 * * * *“(2) Legen Sie den MySQL-Abfragebereich fest, um zu verhindern, dass eine große Anzahl von Abfragen die Datenbank nach unten zieht. Wählen Sie „select * from WHERE autoid >“ aus In der SQL-Anweisung wird die Speicherkapazität von Elasticsearch weiter erhöhtElasticsearch schreibt die Daten nach dem Empfang der Daten zunächst in den Speicher und translogiert sie, erstellt dann einen Index und schreibt sie auf die Festplatte Selbst wenn es zu einem plötzlichen Stromausfall kommt, kann er nach dem Neustart durch Translog wiederhergestellt werden. Da wir jedoch bei jeder Abfrage viele doppelte Daten haben und diese doppelten Daten nicht in den Elasticsearch-Index geschrieben werden, werden sie akkumuliert , wodurch die Elasticsearch-Kapazität weiter zunimmtLösung:

Auf der offiziellen Abfrage-Website heißt es, dass es regelmäßig aktualisiert wird und alte Protokolle automatisch bereinigt werden, sodass keine Verarbeitung erforderlich ist.

Inkrementelle Synchronisierung und MySQL-Bereichsabfrage führen dazu, dass keine Synchronisierung mit den vorherigen Daten möglich ist modifiziert.

Die kleine MySQL-Abfrage wurde jedes Mal gelöst und das Problem des Datenbankdrucks gelöst, aber es verursachte das Problem, dass die Änderung alter Daten nicht synchronisiert werden konnte.

Lösung:

Kann je nach Geschäftsstatus durchgeführt werden Ihre Datenbank wird häufig geändert. Dann können wir nur vollständige Aktualisierungen durchführen, aber die Indizierung durch Scannen der Datenbank mit hoher Frequenz und großem Umfang ist besser als überhaupt keine Indizierung (da die Indizierung auch kostspielig ist, hauptsächlich für einige Daten mit großen Mengen). von Daten, die nicht häufig geändert werden. Diese Situation verbraucht viel Datenbankleistung. Ich habe hier weniger Datenänderungen, und die Änderungen sind im Allgemeinen aktuelle Daten, da ich während der Synchronisierung den MySQL-Bereich leicht angepasst habe Datei, legen Sie die IP-Adresse fest

Index erstellen, Index entspricht der Datenbank in relationalen Daten (im Folgenden als MySQL bezeichnet) und nicht dem Index in MySQL

Es reicht nicht aus, eine Datenbank zu haben, Sie müssen eine Tabelle erstellen Gleiches gilt für ES, ES. Der Typ in entspricht der Tabelle in MySQL. Der Typ wird nicht separat definiert, sondern zusammen mit dem im Textkörper definierten Feld. Sie können die ik-Wortsegmentierung natürlich auch im Textkörperfeld verwenden. Verwenden Sie EsClient->search(), um die Suche zu implementieren Verwendung von Synonymen und Synonymen ik-Verzeichnis für die Plugins im es-Verzeichnis, entpacken Sie alle Dateien im ZIP-Paket, das Sie von ik heruntergeladen haben. Gehen Sie in das Konfigurationsverzeichnis von es, bearbeiten Sie elasticsearch.yml und fügen Sie index.analysis.analyzer.default.type: „ik“ in das Leerzeichen ein.

Pinyin-Wortsegmentierer-Konfiguration: Verwenden Sie die kompilierte Version: elasticsearch-analysis-pinyin-1.3.0

Erstellen Sie im Plugins-Verzeichnis von Elasticsearch einen neuen Analysis-Pinyin-Ordner, entpacken Sie das komprimierte Paket und legen Sie das JAR-Paket in Analysis-Pinyin ab Ordner.
Konfigurieren Sie den Filter des Pinyin-Tokenizers in Elasticsearch.yml



Synonym-Tokenizer-Konfiguration

Konfigurieren Sie den Filter des Synonym-Tokenizers in Elasticsearch.ymlKonfigurieren Sie das Synonymwörterbuch und erstellen Sie ein neues Sysnonym im Konfigurationsverzeichnis von Elasticsearch .txt . Konfigurieren Sie den ik+pinying + Synonym-Wortsegmentierer, der hauptsächlich den Namen und Typ des Wortsegmentierers, die Komponenten zum Segmentieren von Wortelementen und die Verarbeitung segmentierter Dimensionen umfasst: Hier werden Pinyin und Synonyme verwendetES-Schlüsselworthervorhebung ES Durch das Hinzufügen des HTML-Tag-Felds zu den Felddaten nach der Abfrage wird das Dokument bei der Anzeige auf der Weboberfläche nach Farbe oder Schriftart formatiert und das hervorgehobene Feld wird durch Hervorhebung geändert. Dieser Teil enthält die übereinstimmenden Textfragmente Das Namensattribut ist in HTML-Tags gekapselt

ES-Abfrage-Paging

Daten werden in Elasticsearch in Shards gespeichert. Bei der Durchführung einer Suche wird jeder Shard unabhängig durchsucht und die Daten werden integriert und zurückgegeben.


Der allgemeine Abfrageprozess ist

1) Die Client-Anfrage wird an einen bestimmten Knoten gesendet
2) Der Knoten leitet sie an jeden Shard weiter und fragt die obersten 10 Elemente auf jedem Shard ab
3) Die Ergebnisse werden an den Knoten zurückgegeben. Die Daten werden integriert und extrahiert. Die ersten 10 Elemente

4) werden an den anfordernden Client zurückgegeben.

Wenn wir die Daten der Elemente 10 bis 20 abfragen, gibt es zwei Möglichkeiten, einschließlich Tiefen-Paging (von der Größe) und Snapshot-Paging (Bildlauf). ; Tiefen-Paging (von-Größe)

von definiert den Offset-Wert der Zieldaten und Größe definiert die Anzahl der aktuell zurückgegebenen Ereignisse. Der Standardwert ist 0 und die Größe 10, was bedeutet, dass alle Abfragen standardmäßig nur die ersten 10 Daten zurückgeben. Fragen Sie die ersten 20 Daten ab, kürzen Sie dann die ersten 10 Daten und geben Sie nur 10 bis 20 Daten zurück. Die ersten 10 Anfragen waren verschwendet. Je weiter hinten das Paging liegt, desto geringer ist die Ausführungseffizienz. Je größer der Paging-Offset-Wert ist, desto länger dauert die Ausführung der Paging-Abfrage.



Snapshot-Paging (Bildlauf) der abgerufenen Dokumentinformationen. Die Verwendung dieses Pagings besteht nicht darin, Daten in Echtzeit abzufragen, sondern darin, eine große Datenmenge (oder sogar alle Daten) gleichzeitig abzufragen. Da dieser Bildlauf dem Verwalten von Snapshot-Informationen des aktuellen Indexsegments entspricht, sind diese Snapshot-Informationen der Snapshot, wenn Sie diese Scroll-Abfrage ausführen. Alle neuen indizierten Daten nach dieser Abfrage werden in diesem Snapshot nicht abgefragt. Im Vergleich zu from und size fragt es jedoch nicht alle Daten ab und eliminiert unnötige Teile, sondern zeichnet eine Leseposition auf, um sicherzustellen, dass die nächste Lesung schnell fortgesetzt werden kann.

Prozess:
  • Aufruf: index/type/_search?pretty&scroll=2m, einen Bildlaufwert zurückgeben
  • Verwenden Sie scroll_id direkt zum Abfragen.
  • Wenn wir den Bildlauf einrichten, legen wir eine Überlebenszeit für den Bildlauf fest. Wenn wir ihn jedoch nach der Verwendung schließen können, können wir die Belastung für ES verringern. Bitte beachten Sie die Rubrik
  • php-Training
!

Das obige ist der detaillierte Inhalt vonDie Verwendung von ES in MySQL und PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage