Beispielcode zur Implementierung einer einfachen Suchmaschine mit MySQL

Beispielcode zur Implementierung einer einfachen Suchmaschine mit MySQL

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ührung

Tatsä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-Volltextparser

Ein 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 ngram_token_size verwendet, um die Größe von n in ngram zu konfigurieren. Ihr Wertebereich reicht von 1 bis 10, und der Standardwert ist 2. Normalerweise wird ngram_token_size auf die Mindestanzahl der abzufragenden Wörter eingestellt. Wenn Sie nach einzelnen Wörtern suchen müssen, setzen Sie ngram_token_size auf 1. Mit dem Standardwert 2 liefert die Suche nach einem einzelnen Wort keine Ergebnisse. Da ein chinesisches Wort aus mindestens zwei Zeichen besteht, wird der Standardwert 2 empfohlen.

Sie können die Standard ngram_token_size von MySQL anzeigen, indem Sie den folgenden Befehl ausführen:

Variablen wie „ngram_token_size“ anzeigen 

Es gibt zwei Möglichkeiten, den Wert der globalen Variable ngram_token_size festzulegen:

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 Volltextindexes

1. 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;

Suchmethode

1. 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“ vergleichen

Im Vergleich zu ähnlichen Abfragen bietet die Volltextindizierung folgende Vorteile:

  • LIKE führt nur Fuzzy-Matching durch, aber die Volltextindizierung bietet einige grammatikalische und semantische Abfragefunktionen und führt Wortsegmentierungsvorgänge für die zu suchende Zeichenfolge durch, die durch das MySQL-Vokabular bestimmt wird.
  • Der Volltextindex kann die Mindest- und Maximallänge von Wörtern sowie die zu ignorierenden Wörter festlegen. Diese können alle festgelegt werden.
  • Wenn Sie mithilfe eines Volltextindex nach einer Zeichenfolge in einer Spalte suchen, wird der Übereinstimmungsgrad zurückgegeben. Dieser kann als die Anzahl der übereinstimmenden Schlüsselwörter verstanden werden, die wiederum eine Gleitkommazahl ist.

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.

Zusammenfassen

Durch 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:
  • MySQL-Volltextindex, um eine einfache Version des Suchmaschinen-Beispielcodes zu erreichen
  • Detaillierte Einführung in MySQL-Fulltext, eine auf MySQL basierende Suchmaschine
  • Scrapy+flask+html zum Erstellen eines Beispielcodes für die Suchmaschine
  • Python implementiert eine suchmaschinenbasierte Funktion zur Überprüfung von Artikelduplikaten
  • Python praktische Handschrift einer Suchmaschine
  • Detaillierte Erläuterung des Bild-Crawler-Tools für große Suchmaschinen in Python
  • 360-Suchmaschine automatische Einbindung PHP Rewriting-Lösung
  • PHP-Implementierungscode zum Aufzeichnen von Crawling-Datensätzen von Suchmaschinen
  • Implementierungscode der verlustfreien Musiksuchmaschine in Python
  • Implementieren Sie eine einfache Suchmaschine auf Basis von MySQL

<<:  Teilen Sie 5 JS-High-Order-Funktionen

>>:  Detaillierter Prozess der Installation von Logstash in Docker

Artikel empfehlen

Fähigkeiten zur Erstellung von Webformularen

Tatsächlich haben die drei obigen Tabellen alle d...

Eine kurze Erläuterung des zugrunde liegenden Prinzips von MySQL Join

Inhaltsverzeichnis Join-Algorithmus Der Unterschi...

Integrierte Objekte, Werttypen und Referenztypen in JavaScript-Objekten erklärt

Inhaltsverzeichnis Objekt Objektdefinition Iterie...

Erfahren Sie schnell, wie Sie mit der Vuex-Statusverwaltung in Vue3.0 beginnen

Vuex ist ein speziell für Vue.js-Anwendungen entw...

Erste Schritte Tutorial für Anfänger ④: So binden Sie Unterverzeichnisse

Um zu verstehen, was das bedeutet, müssen wir zunä...

Tipps zur Optimierung von MySQL SQL-Anweisungen

Wenn wir mit einer SQL-Anweisung konfrontiert wer...

Nginx beschränkt den IP-Zugriff auf bestimmte Seiten

1. Um allen IP-Adressen den Zugriff auf die drei ...

Detailliertes Beispiel für die Verwendung von useState in React

Verwendungsstatus useState fügt einer Komponente ...

Detaillierte Erklärung zur Verwendung des Alias-Befehls unter Linux

1. Verwendung von Pseudonymen Mit dem Alias-Befeh...

Einige Tipps zur richtigen Verwendung des HTML-Titelattributs

Wenn Sie Inhalte vor Benutzern von Telefonen, Tabl...

Implementierungs- und Nutzungsszenarien der JS-Anti-Shake-Drosselungsfunktion

Inhaltsverzeichnis 1. Was ist die Anti-Shake-Funk...