Vorwort Vor einiger Zeit mussten wir aufgrund von Projektanforderungen Chatprotokolle anhand von Schlüsselwörtern durchsuchen. Ist das nicht die Funktion einer Suchmaschine? Das erste, was mir in den Sinn kam, war die verteilte Suchmaschine ElasticSearch, aber aus irgendeinem Grund waren die Serverressourcen des Unternehmens relativ knapp und es gab keine zusätzlichen Maschinen, um einen ElasticSearch-Dienst bereitzustellen. Darüber hinaus war die Onlinezeit relativ knapp und die Datenmenge nicht groß. Dann dachte ich an den Volltextindex von MySQL. EinführungTatsächlich unterstützt MySQL die Volltextindizierung schon seit langem, allerdings nur die Suche auf Englisch. Ab Version 5.7.6 verfügt MySQL über einen integrierten Ngram-Volltextparser zur Unterstützung der chinesischen, japanischen und koreanischen Wortsegmentierung. Der MySQL-Volltextindex verwendet das Prinzip des invertierten Index. Im invertierten Index ist das Schlüsselwort der Primärschlüssel, und jedes Schlüsselwort entspricht einer Reihe von Dateien, in denen das Schlüsselwort vorkommt. Wenn ein Benutzer auf diese Weise nach einem Schlüsselwort sucht, lokalisiert das Sortierprogramm das Schlüsselwort im invertierten Index und kann sofort alle Dateien finden, die das Schlüsselwort enthalten. Dieser Artikel wurde basierend auf MySQL 8.0 getestet und die verwendete Datenbank-Engine ist InnoDB Ngram-VolltextparserEin N-Gramm ist eine Folge von n aufeinanderfolgenden Wörtern in einem Text. Der Ngram-Volltextparser kann Text in Tokens zerlegen, wobei jedes Wort eine Folge von n aufeinanderfolgenden Wörtern ist. Verwenden Sie beispielsweise den Ngram-Volltextparser, um „你好靓仔“ zu segmentieren: n=1: 'du', 'gut', 'hübsch', 'Junge' n=2: ‚Hallo‘, ‚Sehr hübsch‘, ‚Hübscher Junge‘ n=3: ,Du bist so hübsch‘, ,Du bist so hübsch‘ n=4: ‚Hallo hübscher Junge‘ In MySQL wird die globale Variable Sie können die Standard Variablen wie „ngram_token_size“ anzeigen Es gibt zwei Möglichkeiten, den Wert der globalen Variable 1. Geben Sie beim Starten des mysqld-Befehls an: mysqld --ngram_token_size=2 2. Ändern Sie die Mysql-Konfigurationsdatei my.ini und fügen Sie am Ende eine Parameterzeile hinzu: ngram_token_size=2 Erstellen eines Volltextindexes1. Erstellen Sie beim Erstellen einer Tabelle einen Volltextindex CREATE TABLE `Artikel` ( `id` bigint NICHT NULL, `url` varchar(1024) COLLATE utf8mb4_general_ci NICHT NULL STANDARD '', `title` varchar(256) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `Quelle` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '', `Schlüsselwörter` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `publish_time` Zeitstempel NULL DEFAULT NULL, Primärschlüssel (`id`), VOLLTEXT-SCHLÜSSEL `title_index` (`title`) MIT PARSER `ngram` ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 2. Durch die Methode „Tabelle ändern“ ALTER TABLE-Artikel ADD FULLTEXT INDEX title_index(Titel) MIT PARSER ngram; 3. Durch die Methode „Index erstellen“ ERSTELLEN SIE EINEN VOLLSTÄNDIGEN TEXTINDEX title_index FÜR Artikel (Titel) MIT PARSER ngram; Suchmethode1. Suche in natürlicher Sprache (NATURAL LANGUAGE MODE)Der Modus für natürliche Sprache ist der Standard-Volltextsuchmodus von MySQL. Der Modus für natürliche Sprache kann keine Operatoren verwenden und keine komplexen Abfragen angeben, wie etwa „Schlüsselwörter müssen vorkommen“ oder „dürfen nicht vorkommen“. Beispiel Wählen Sie * aus dem Artikel, wo MATCH(title) AGAINST (,Beijing Tourism‘ im Modus für natürliche Sprache); // Wenn kein Modus angegeben ist, wird standardmäßig der natürliche Sprachmodus verwendet. select * from article where MATCH(title) AGAINST ('北京旅游'); Es ist ersichtlich, dass in diesem Modus bei der Suche nach „Beijing Travel“ nach Inhalten gesucht werden kann, die „Beijing“ oder „Travel“ enthalten, da die Suche auf der Grundlage der natürlichen Sprache in zwei Schlüsselwörter unterteilt ist. Im obigen Beispiel werden die zurückgegebenen Ergebnisse automatisch nach Übereinstimmungsgrad sortiert, wobei der höchste Übereinstimmungsgrad vorne steht. Der Übereinstimmungsgrad ist eine nicht negative Gleitkommazahl. Beispiel // Überprüfen Sie den Übereinstimmungsgrad, wählen Sie *, MATCH(title) AGAINST (,Beijing Tourism‘) als Punktzahl aus dem Artikel, wobei MATCH(title) AGAINST (,Beijing Tourism‘ im Modus „NATÜRLICHE SPRACHLICH“). 2. Boolesche Suche (BOOLEAN MODE)Der Boolesche Suchmodus kann Operatoren verwenden, um komplexe Abfragen zu unterstützen, z. B. die Angabe, dass ein Schlüsselwort vorkommen muss oder nicht vorkommen darf oder ob die Schlüsselwortgewichtung hoch oder niedrig ist. Beispiel // Kein Operator // Enthält „Dating“ oder „Strategy“ Wählen Sie * aus dem Artikel, wobei MATCH(Titel) GEGEN (,Dating Guide‘ im Booleschen Modus) gilt; // Operator verwenden // Muss „Dating“ enthalten, kann „Strategy“ enthalten Wählen Sie * aus dem Artikel, wo MATCH(Titel) GEGEN ('+Dating Guide' im Booleschen Modus); Weitere Operatorbeispiele: „Dating-Tipps“ Kein Operator, also ODER, enthält entweder "Dating" oder "Strategie" '+Dating+Strategien' Muss die beiden Wörter „+Dating-Tipps“ enthalten „Dating“ muss enthalten sein, die Übereinstimmung ist jedoch höher, wenn auch „Strategie“ enthalten ist. '+Dating-Strategie' Es muss „Datum“ enthalten und darf nicht „Strategie“ enthalten. '+Dating~Strategie' „Dating“ muss enthalten sein, wenn aber auch „Strategie“ enthalten ist, ist der Übereinstimmungswert niedriger als der Datensatz ohne „Strategie“. '+Dating+(>Strategien<Tipps)' Die Abfrage muss Datensätze für „Dating“ und „Strategien“ oder „Dating“ und „Fähigkeiten“ enthalten, aber „Dating-Strategien“ hat eine höhere Übereinstimmung als „Dating-Fähigkeiten“. 'Dating*' Die Abfrage umfasst Datensätze, die mit „Termin“ beginnen. „Dating-Tipps“ Verwenden Sie doppelte Anführungszeichen, um die zu suchenden Wörter einzuschließen. Die Wirkung ist ähnlich wie bei '%Dating Guide%'. Beispielsweise wird „Dating-Strategien für Anfänger“ abgeglichen, „Dating-Strategien“ jedoch nicht. Mit „Gefällt mir“ vergleichenIm Vergleich zu ähnlichen Abfragen bietet die Volltextindizierung folgende Vorteile:
Und die Leistung der Volltextsuche ist besser als die der ähnlichen Abfrage Das Folgende ist ein Test, der auf etwa 50-W-Daten basiert: // wie Abfrageauswahl * aus Artikel, wo der Titel wie „%北京%“ aussieht; // Volltextindexabfrage select * from article where MATCH(title) AGAINST ('北京' IN BOOLEAN MODE); Es ist ersichtlich, dass die Like-Abfrage 1,536 s und die Volltextindexabfrage 0,094 s dauert, was ungefähr 16-mal schneller ist. ZusammenfassenDurch die Volltextindizierung sind schnelle Suchvorgänge möglich, allerdings ist auch die Indexpflege mit einem hohen Aufwand verbunden. Je größer die Feldlänge, desto größer ist der erstellte Volltextindex, was sich auf den Durchsatz von DML-Anweisungen auswirkt. Wenn die Datenmenge nicht groß ist, können Sie für die Suche die Volltextindizierung verwenden, was einfach und bequem ist. Wenn die Datenmenge jedoch groß ist, wird empfohlen, hierfür eine spezielle Suchmaschine ElasticSearch zu verwenden. Dies ist das Ende dieses Artikels über den Beispielcode zur Implementierung einer einfachen Suchmaschine in MySQL. Weitere relevante Inhalte zur MySQL-Suchmaschine finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Teilen Sie 5 JS-High-Order-Funktionen
>>: Detaillierter Prozess der Installation von Logstash in Docker
Tatsächlich haben die drei obigen Tabellen alle d...
Überblick über die Alibaba Cloud Security Group F...
Inhaltsverzeichnis Join-Algorithmus Der Unterschi...
Inhaltsverzeichnis Objekt Objektdefinition Iterie...
Vuex ist ein speziell für Vue.js-Anwendungen entw...
Um zu verstehen, was das bedeutet, müssen wir zunä...
Wenn wir mit einer SQL-Anweisung konfrontiert wer...
1. Um allen IP-Adressen den Zugriff auf die drei ...
Verwendungsstatus useState fügt einer Komponente ...
Frage Im vorherigen Artikel zur domänenübergreife...
1. Verwendung von Pseudonymen Mit dem Alias-Befeh...
HTML-Onfocus-Ereignisattribute Definition und Ver...
Ich glaube, dass viele Benutzer, die Websites ers...
Wenn Sie Inhalte vor Benutzern von Telefonen, Tabl...
Inhaltsverzeichnis 1. Was ist die Anti-Shake-Funk...