Implementieren Sie eine einfache Suchmaschine auf Basis von MySQL

Implementieren Sie eine einfache Suchmaschine auf Basis von MySQL

Implementierung einer Suchmaschine auf Basis von MySQL

Vorwort:

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

1. 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-Kommandos an:

mysqld --ngram_token_size=2

(2) Modifizieren Sie die MySQL-Konfigurationsdatei my.ini und fügen Sie am Ende eine Parameterzeile hinzu:

ngram_token_size=2

2. Erstellen Sie einen Volltextindex

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 STANDARD-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;

3. 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.

4. Vergleich mit Like

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.

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.

Oben sind die Details zur Implementierung einer einfachen Suchmaschine auf MySQL-Basis beschrieben. Weitere Informationen zur Implementierung von Suchmaschinen mit MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Gemeinsame Nutzung von MySQL-Zeichensatz und Änderungsmethoden für die Datenbank-Engine
  • Praktisches Tutorial zum Ändern des MySQL-Zeichensatzes
  • Tutorial zum Anzeigen und Ändern von MySQL-Zeichensätzen
  • MySQL-Startfehler 1067 und ungültige Wiederherstellung nach Änderung des Zeichensatzes und Neustart
  • So ändern Sie die Zeichensatzkodierung in MySQL 5.5/5.6 unter Linux auf UTF8
  • Vergleich der von der MySQL-Datenbank unterstützten Speicher-Engines
  • Unterschiede und Vergleiche von Speicher-Engines in MySQL
  • MySQL-Lernzusammenfassung: Ein vorläufiges Verständnis des Architekturdesigns der InnoDB-Speicher-Engine
  • MySQL ändert die Standard-Engine und Zeichensatzdetails

<<:  Implementieren benutzerdefinierter Radio- und Kontrollkästchenfunktionen mit reinem CSS

>>:  So passen Sie mit CSS einen schöneren Link-Prompt-Effekt an

Artikel empfehlen

Implementierung des Vue-Zählers

Inhaltsverzeichnis 1. Implementierung des Zählers...

MySQL 8.0.17 Installations- und einfaches Konfigurationstutorial unter macOS

Wenn Sie nicht verstehen, was ich geschrieben hab...

TypeScript-Problem beim Iterieren über Objekteigenschaften

Inhaltsverzeichnis 1. Problem 2. Lösung 1. Deklar...

Detaillierte Analyse, wann Tomcat das Antwortdatagramm zurückschreibt

Es stellt sich die Frage Diese Frage kam auf, als...

Diagramm des Prozesses zur Implementierung eines Richtungsproxys durch Nginx

Dieser Artikel stellt hauptsächlich den Prozess d...

Lösung für das Problem des MySQL-Master-Slave-Switch-Kanals

Nach der VIP-Konfiguration wird beim Aktiv/Standb...

Das Vue-Projekt realisiert den Paging-Effekt

Der Paging-Effekt wird zu Ihrer Information im Vu...

Verstehen Sie kurz die MySQL-Datenbankoptimierungsphase

Einführung Haben Sie schon einmal eine Situation ...

Beispiel für die Anzeige von Bildjalousien mit reinem CSS

Lassen Sie mich Ihnen zunächst den fertigen Effek...

Detaillierte Erklärung der dynamischen Angular-Komponenten

Inhaltsverzeichnis Anwendungsszenarien So erreich...

So erstellen Sie Ihre eigene Angular-Komponentenbibliothek mit DevUI

Inhaltsverzeichnis Vorwort Erstellen einer Kompon...

Detaillierte Erklärung der Vue-Anmeldung und -Abmeldung

Inhaltsverzeichnis Login-Geschäftsprozess Impleme...