Beispiel einer MySQL-Implementierung einer Volltextsuche und einer Methode zur Bewertung von Schlüsselwörtern

Beispiel einer MySQL-Implementierung einer Volltextsuche und einer Methode zur Bewertung von Schlüsselwörtern

1. Einleitung

Heute hat mich ein Kollege gefragt, wie man mit MySQL eine Volltextsuchfunktion ähnlich ElasticSearch implementieren und die Suchbegriffe auswerten kann. Mir ging sofort eine Frage durch den Kopf? Warum nicht einfach „es“ verwenden? Einfach, benutzerfreundlich und schnell. Er sagte jedoch, dass die Datenmenge nicht groß sei, die vom Client zur Verfügung gestellte Zeit sehr begrenzt sei und keine Zeit zum Erstellen von ES bleibe. Schauen wir uns also die Volltextsuchfunktion von MySQL an!

Ab Version 5.7.6 verfügt MySQL über einen integrierten Ngram-Volltextparser zur Unterstützung der chinesischen, japanischen und koreanischen Wortsegmentierung. Vor MySQL 5.7.6 unterstützte die Volltextindizierung nur die englische Volltextindizierung, nicht die chinesische Volltextindizierung. Es war notwendig, einen Wortsegmentierer zu verwenden, um die chinesischen Absätze in Wörter vorzuverarbeiten und sie dann in der Datenbank zu speichern. Dieser Artikel wurde mit Mysql 5.7.6, InnoDB-Datenbank-Engine, getestet. MySQL-Volltextsuche

2. Volltextparser ngram

Ein N-Gramm ist eine Folge von n aufeinanderfolgenden Wörtern in einem Text. Der Ngram-Volltextparser kann Text in Wörter segmentieren, wobei jedes Wort eine Folge von n aufeinanderfolgenden Wörtern ist.
Verwenden Sie beispielsweise den Ngram-Volltextparser, um „Hallo Welt“ zu tokenisieren:

n=1: 'du', 'gut', 'Welt', 'Welt' 
n=2: ‚Hallo‘, ‚Gute Welt‘, ‚Welt‘ 
n=3: ‚Hallo Welt‘, ‚Gute Welt‘ 
n=4: 'Hallo Welt'

MySQL verwendet die globale Variable ngram_token_size, 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.

Werfen wir einen Blick auf die Standard-ngram_token_size von MySQL:

Variablen wie „ngram_token_size“ anzeigen

Es gibt zwei Möglichkeiten, die 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

[mysqld] 
ngram_token_size=2

3. Volltextindex

Am Beispiel von Dokumentdaten wird eine neue Datentabelle t_wenshu erstellt, ein Volltextindex für das Dokumentinhaltsfeld erstellt und 100.000 Testdaten importiert.

1. Erstellen Sie beim Erstellen einer Tabelle einen Volltextindex

Tabelle erstellen `t_wenshu` (
 `Provinz` varchar(255) DEFAULT NULL,
 `caseclass` varchar(255) DEFAULT NULL,
 `Fallnummer` varchar(255) DEFAULT NULL,
 `caseid` varchar(255) DEFAULT NULL,
 `Typen` varchar(255) DEFAULT NULL,
 `Titel` varchar(255) DEFAULT NULL,
 `Inhalt` Langtext,
 `updatetime` varchar(255) DEFAULT NULL,
 VOLLTEXT-SCHLÜSSEL `content` (`content`) MIT PARSER `ngram`
)ENGINE=InnoDB STANDARD-CHARSET=utf8;

2. Durch die Methode „Tabelle ändern“

ALTER TABLE t_wenshu ADD FULLTEXT INDEX content_index (Inhalt) MIT PARSER ngram;

3. Durch die Methode „Index erstellen“

ERSTELLEN SIE EINEN VOLLSTÄNDIGEN TEXTINDEX content_index AUF t_wenshu (Inhalt) MIT PARSER ngram;

4. Suchmodus

Natürliche Sprachsuche

(IM NATÜRLICHEN SPRACHMODUS) Der natürliche Sprachmodus 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“.

Boolesche Suche

(IM BOOLEAN-MODUS) Eliminieren Sie Wörter, die in mehr als der Hälfte der übereinstimmenden Zeilen vorkommen. Wenn beispielsweise jede Zeile das Wort „dieses“ enthält, werden bei der Suche mit „diesem“ keine Ergebnisse gefunden. Dies ist sehr nützlich, wenn eine große Anzahl von Datensätzen vorhanden ist, da die Datenbank der Ansicht ist, dass es sinnlos ist, alle Zeilen zu finden. In diesem Fall wird „dieses“ fast als Stoppwort betrachtet. Operatoren können im Booleschen Suchmodus verwendet werden, um komplexe Abfragen zu unterstützen, z. B. um anzugeben, dass ein Schlüsselwort vorkommen muss oder nicht vorkommen darf oder ob die Schlüsselwortgewichtung hoch oder niedrig ist.

● Funktionen im Boolean-Modus:
Entfernen Sie keine Zeilen, die zu mehr als 50 % mit den Kriterien übereinstimmen.
Sortiert nicht automatisch in umgekehrter Reihenfolge der Relevanz.
Es ist möglich, Felder ohne FULLTEXT-Index zu durchsuchen, dies wird jedoch sehr langsam sein.
· Begrenzen Sie die maximale und minimale Anzahl an Zeichenfolgen.
· Stoppwörter anwenden.

● Suchsyntaxregeln:
+ Muss vorhanden sein (Dateneinträge, die dieses Schlüsselwort nicht enthalten, werden ignoriert).
- Nicht zulässig (außer dem angegebenen Schlüsselwort. Alle Einträge, die das Schlüsselwort enthalten, werden ignoriert).
> Erhöhen Sie das Gewicht dieser übereinstimmenden Daten.
< Reduzieren Sie das Gewicht der übereinstimmenden Daten.
~ ändert seine Korrelation von positiv zu negativ und weist darauf hin, dass das Vorhandensein des Wortes die Korrelation verringert (aber nicht „Gefällt mir“, was es ausschließt); es wird lediglich niedriger eingestuft und hat ein geringeres Gewicht.
* Platzhalter. Im Gegensatz zu anderen Syntaxen, bei denen er am Anfang steht, sollte dieser nach der Zeichenfolge platziert werden.
" " Verwenden Sie doppelte Anführungszeichen, um einen Satz einzuschließen, um anzugeben, dass er vollständig mit dem Originalsatz übereinstimmen muss und Zeichen nicht getrennt werden können.

Abfrageerweiterungssuche

Hinweis: (MIT ABFRAGE-ERWEITERUNG) Da die Abfrage-Erweiterung viele irrelevante Abfragen liefern kann, verwenden Sie sie mit Vorsicht!

5. Suchanfrage

1) Abfrage der Datensätze, deren Inhalt "Diebstahl" enthält. Die Abfrageanweisung lautet wie folgt

Wählen Sie CaseID, Inhalt, MATCH (Inhalt) GEGEN („Diebstahl“) als Punktzahl aus t_wenshu, wobei MATCH (Inhalt) GEGEN („Diebstahl“ im Modus „NATÜRLICHE SPRACH“).

2) Suchen Sie nach Datensätzen, die im Inhalt "挑交惹事" enthalten. Die Abfrageanweisung lautet wie folgt

Wählen Sie Case-ID, Inhalt, VERGLEICH (Inhalt) GEGEN (,,寻怨惹事‘) als Punktzahl von t_wenshu, wobei VERGLEICH (Inhalt) GEGEN (,,寻怨惹事‘ IM NATÜRLICHEN SPRACHMODUS);

3) Einzelnes chinesisches Zeichen, Suche nach Datensätzen, deren Inhalt "我" enthält. Die Abfrageanweisung lautet wie folgt

Wählen Sie Case-ID, Inhalt, VERGLEICH (Inhalt) GEGEN (,我‘) als Punktzahl von t_wenshu, wobei VERGLEICH (Inhalt) GEGEN (,我‘ IM NATÜRLICHEN SPRACHMODUS);

Hinweis: Weil der Wert der globalen Variable ngram_token_size auf 2 gesetzt ist. Wenn Sie ein einzelnes chinesisches Zeichen abfragen möchten, müssen Sie ngram_token_size = 1 in der Konfigurationsdatei my.ini ändern und den mysqld-Dienst neu starten. Ich werde das hier nicht versuchen.

4) Der Inhalt des Abfragefeldes enthält die Begriffe „gefährliches Fahren“ und „Streit anfangen und Ärger provozieren“ wie folgt:

Wählen Sie Fall-ID, Inhalt, VERGLEICH (Inhalt) GEGEN („+gefährliches Fahren+Streit anfangen und Ärger provozieren“) als Punktzahl aus t_wenshu, wobei VERGLEICH (Inhalt) GEGEN („+gefährliches Fahren+Streit anfangen und Ärger provozieren“ IM BOOLEANISCHEN MODUS);

5) Der Inhalt des Abfragefelds enthält „gefährliches Fahren“, aber nicht „Streit anfangen und Ärger provozieren“, und zwar wie folgt:

Wählen Sie CaseID, Inhalt, MATCH (Inhalt) GEGEN („+gefährliches Fahren – Streit anzetteln und Ärger provozieren“) als Punktzahl aus t_wenshu, wobei MATCH (Inhalt) GEGEN („+gefährliches Fahren – Streit anzetteln und Ärger provozieren“ im Booleschen Modus);

6) Der Inhalt des Abfragefeldes enthält „gefährliches Fahren“ oder „Streit anfangen und Ärger provozieren“ wie folgt:

Wählen Sie Case-ID, Inhalt, MATCH (Inhalt) GEGEN („Gefährliches Fahren und Ärger provozieren“) als Punktzahl aus t_wenshu, wobei MATCH (Inhalt) GEGEN („Gefährliches Fahren und Ärger provozieren“ im Booleschen Modus);

VI. Fazit

1) Informieren Sie sich über den Supportstatus der einzelnen Versionen, bevor Sie die MySQL-Volltextindizierung verwenden.

2) Die Volltextindizierung ist N-mal schneller als + %, aber es kann zu Genauigkeitsproblemen kommen;

3) Wenn eine große Datenmenge vollständig indiziert werden muss, wird empfohlen, zuerst die Daten hinzuzufügen und dann den Index zu erstellen.

4) Für Chinesisch können Sie MySQL 5.7.6 oder spätere Versionen oder Plug-Ins von Drittanbietern wie Sphinx und Lucene verwenden.

5) Der von der Funktion MATCH() verwendete Feldname muss mit dem beim Erstellen des Volltextindex angegebenen Feldnamen übereinstimmen und kann nur aus Feldern derselben Tabelle bestehen und darf nicht tabellenübergreifend sein.

Dies ist das Ende dieses Artikels über MySQL-Volltextsuche und Keyword-Bewertung. Weitere relevante Inhalte zu MySQL-Volltextsuche und Keyword-Bewertung finden Sie in den vorherigen Artikeln von 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:
  • Detaillierte Analyse der chinesischen Volltextsuche in MySQL 5.7
  • Chinesische Lösung und Beispielcode für die MySQL-Volltextsuche
  • Anwendungsbeispiele für die MySQL-Volltextsuche
  • MySQL 5.7.25-Tutorial zur Volltextsuche

<<:  Allgemeine Array-Operationen in JavaScript

>>:  Ubuntu startet den Remote-Anmeldevorgang des SSH-Dienstes

Artikel empfehlen

Zusammenfassung der grundlegenden Operationen für MySQL-Anfänger

Bibliotheksbetrieb Abfrage 1.SHOW DATABASE; ----A...

Java importiert Daten aus Excel in MySQL

Manchmal müssen wir bei unserer tatsächlichen Arb...

Zusammenfassung mehrerer APIs oder Tipps in HTML5, die Sie nicht verpassen sollten

In früheren Blogbeiträgen habe ich mich auf einige...

Einführung und detaillierte Verwendung von React Fragment

Inhaltsverzeichnis Vorwort Motivation für Fragmen...

Zusammenfassung der Wissenspunkte des Datenbankindex

Inhaltsverzeichnis Erster Blick-Index Das Konzept...

Beispiele für die Verwendung des Linux-Touch-Befehls

Detaillierte Erklärung des Linux-Touch-Befehls: 1...

Zusammenfassung der Lastausgleichsmethoden von Nginx

Um den Lastenausgleich zu verstehen, müssen Sie s...

Implementierung der CSS-Rahmenlängensteuerungsfunktion

Wenn die Rahmenlänge früher kleiner als der Conta...

Grundlegende Kenntnisse zur MySQL-Wurmreplikation

Würmer replizieren sich, wie der Name schon sagt,...

Anwendungshandbuch für chinesische WEB-Schriftarten

Die Verwendung von Schriftarten im Web ist sowohl ...