Anwendungsbeispiele für die MySQL-Volltextsuche

Anwendungsbeispiele für die MySQL-Volltextsuche

1. Umweltvorbereitung

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. Ab MySQL 5.7.6 verfügt MySQL über einen integrierten Ngram-Volltextparser zur Unterstützung der chinesischen, japanischen und koreanischen Wortsegmentierung. Die in diesem Artikel verwendete MySQL-Version ist 5.7.22, InnoDB-Datenbank-Engine.

Hier benötigen Sie also eine MySQL-Version größer als 5.7.6

- Überprüfen Sie die MySQL-Version mysql> select version();
+-------------+
| version() |
+-------------+
| 5.7.33 |
+-------------+
1 Zeile im Satz (0,02 Sek.)

Fügen Sie der MySQL-Konfigurationsdatei Wortsegmentierung und Mindestwortlänge hinzu (falls bereits konfiguriert, können Sie es ignorieren)

ft_min_word_len Die standardmäßige Mindestzeichenlänge beträgt 4, was im Englischen angemessen ist, im Chinesischen jedoch geändert werden muss.

ngram_token_size Die Mindestlänge der Segmentierung. Beispielsweise können unterschiedliche Längen der Segmentierung von „Hallo Welt“

n=1: 'du', 'gut', 'Welt', 'Welt' 
n=2: ‚Hallo‘, ‚Gute Welt‘, ‚Welt‘ 
n=3: ‚Hallo Welt‘, ‚Gute Welt‘ 
n=4: 'Hallo Welt'
# /etc/mysql/mysql.conf.d/mysqld.cnf

ft_min_word_len = 2
ngram_token_size = 2


# Wenn nicht, fügen Sie die Konfiguration echo 'ft_min_word_len = 2 hinzu
ngram_token_size = 2' >> mysqld.cnf

# Dienst neu starten /etc/init.d/mysql restart

-- Sehen Sie sich die Konfiguration von MySQL an> 
VARIABLEN WIE „ft_min_word_len“ ANZEIGEN;
VARIABLEN WIE „ngram_token_size“ ANZEIGEN;
+-----------------+--------+
| Variablenname | Wert |
+-----------------+--------+
| ft_min_Wortlänge | 2 |
+-----------------+--------+
1 Zeile im Satz (0,02 Sek.)
 
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| ngram_token_größe | 2 |
+------------------+--------+
1 Zeile im Satz (0,03 Sek.)


2. Datenaufbereitung

-- Demo von MySQL für die Volltextsuche

mysql> CREATE TABLE `Artikel` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(50) DEFAULT NULL COMMENT 'Betreff',
  `content` longtext NICHT NULL KOMMENTAR 'Inhalt',
  Primärschlüssel (`id`),
  VOLLTEXT-SCHLÜSSEL `title_content_index` (`content`,`title`) /*!50100 MIT PARSER `ngram` */ 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
Abfrage OK, 0 Zeilen betroffen (0,20 Sek.)
 

mysql> INSERT INTO Artikel (`Titel`, `Inhalt`) WERTE
        ('Wenn', 'Ich werde in diesem Leben nie wieder an dich denken, außer in manchen tränenerfüllten Nächten, wenn du willst'),
        (,Liebe‘, ,Eines Tages wird das Straßenschild verschoben, ich hoffe, du kannst ruhig bleiben. Eines Tages ist der Brückenpfeiler zerbrochen, ich hoffe, du kannst hinüber. Eines Tages fällt die Säule, ich hoffe, du kannst stark sein. Eines Tages schwindet die Erwartung, ich hoffe, du kannst es verstehen‘),
        („Fern und nah“, „Du schaust mich eine Weile an und dann zu den Wolken. Ich habe das Gefühl, wenn du mich ansiehst, bin ich ganz weit weg, und wenn du zu den Wolken schaust, bist du ganz nah“),
        ('Fragment', 'Du stehst auf der Brücke und schaust dir die Landschaft an,
Die Leute, die die Landschaft beobachten, beobachten Sie von oben.
Der helle Mond schmückt dein Fenster,
Sie schmücken die Träume anderer Leute. '),
        ('Solo', 'Ich sage dir, du fehlst mir wie eine Steinstatue, Schweigen ist nicht richtig. Wenn Schweigen deine Traurigkeit ist, weißt du, dass diese Traurigkeit mir am meisten wehtut.');

Abfrage OK, 5 Zeilen betroffen (0,08 Sek.)
Datensätze: 5 Duplikate: 0 Warnungen: 0
 
mysql> SELECT * aus Artikeln, bei denen Übereinstimmung (Inhalt, Titel) gegen ('风景' im NATÜRLICHEN SPRACHMODUS) LIMIT 10 vorliegt;
+----+--------+------------------------------------------------------------------------------------------------------------------------+
| ID | Titel | Inhalt |
+----+--------+------------------------------------------------------------------------------------------------------------------------+
| 10 | Fragment | Sie stehen auf der Brücke und betrachten die Landschaft.
Die Leute, die die Landschaft beobachten, beobachten Sie von oben.
Der helle Mond schmückt dein Fenster,
Sie schmücken die Träume anderer Leute. |
+----+--------+------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,02 Sek.)

3. Starten Sie die Show

  • NATÜRLICHER SPRACHMODUS

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

  • BOOLEAN-MODUS

Der BOOLEAN-Modus 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.

  • Abfrageerweiterung

Die Abfrageergebnisse stimmen nicht nur mit den Ergebnissen überein, sondern verknüpfen diese auch mit anderen von Ihnen benötigten Ergebnissen. (Ähnlich wie bei zugehörigen Abfragen, aber die offizielle Website empfiehlt, nur Phrasenabfragen zu unterstützen, da sonst viele fehlerhafte Daten angezeigt werden.)

- Abfrage im Modus für natürliche Sprache (NATURAL LANGUAGE MODE) und Abrufen des Punktestands mysql> SELECT id, title, MATCH (content, title) against ('风景' IN NATURAL LANGUAGE MODE) AS score FROM articles;
+----+-----------+--------------------+
| ID | Titel | Punktzahl |
+----+-----------+--------------------+
| 7 | wenn | 0 |
| 8 | Liebe | 0 |
| 9 | Fern und nah | 0 |
| 10 | Fragment | 0,9771181344985962 |
| 11 | Monolog | 0 |
+----+-----------+--------------------+
5 Zeilen im Satz (0,02 Sek.)

-- BOOLEAN MODE kann zum Kombinieren von Abfragen verwendet werden mysql> SELECT id, title FROM articles where MATCH (content, title) against ( '+风景-爱情' IN BOOLEAN MODE );
+----+--------+
| ID | Titel |
+----+--------+
| 10 | Fragment |
+----+--------+
1 Zeile im Satz (0,01 Sek.)

- Abfrageerweiterung (QUERY EXPANSION) kann andere Ergebnisse verknüpfen mysql> SELECT id, title FROM articles where MATCH (content, title) against ( '风景' WITH QUERY EXPANSION );
+----+--------+
| ID | Titel |
+----+--------+
| 10 | Fragment |
| 11 | Monolog|
+----+--------+
2 Zeilen im Satz (0,02 Sek.)
 

4. Wortsegmentierungs-Engine

Derzeit verfügt die offizielle Website MeCab Full-Text Parser über ein Plug-In zur Wortsegmentierung, das Japanisch unterstützt (das die Semantik besser verstehen kann).

Integrierter Volltextparser Da die Standardwortgrenze im Englischen ein Leerzeichen ist, können Sie bei der Verarbeitung englischen Textes einfach Leerzeichen als Trennzeichen verwenden. Bei der Verarbeitung von Chinesisch ist es jedoch erforderlich, die Semantik zu verstehen und eine effektive Wortsegmentierung durchzuführen. Daher bietet MySQL bei der Verarbeitung von Chinesisch, Japanisch und Koreanisch Ngram-Volltext (die Konfiguration in diesem Artikel basiert auf der chinesischen Ngram-Wortsegmentierung).

Zusammenfassen

Vorteil

  • Im Vergleich zu ähnlichen Abfragen ist die Effizienz verbessert (es wurde kein spezieller Test durchgeführt)
  • Mit der Volltextsuche können mehrere Felder gleichzeitig indiziert werden, mit like kann jedoch nur ein einzelnes Feld durchsucht werden.

Bei der chinesischen Wortsegmentierung kann es notwendig sein, die Semantik zu verstehen, bevor eine effektive Wortsegmentierung vorgenommen werden kann. Beispielsweise kann das englische Wort „Hallo Welt“ durch Leerzeichen segmentiert werden, im Chinesischen ist es jedoch notwendig, die Semantik zu verstehen, bevor es in „Hallo/Welt“ segmentiert werden kann.

Hier teile ich die Jieba-Wortsegmentierung in Python, die hilft, den Charme der chinesischen Wortsegmentierung zu verstehen

Die Jieba-Wortsegmentierung verwendet ein chinesisches Vokabular, um die Assoziationswahrscheinlichkeit zwischen chinesischen Schriftzeichen zu berechnen, aus denen Wörter bestehen. Daher kann durch Berechnen der Wahrscheinlichkeit zwischen chinesischen Schriftzeichen das Ergebnis der Wortsegmentierung gebildet werden.

In [1]: importiere jieba

In [2]: jieba.lcut("Hallo Welt")
Präfixwörterbuch aus dem Standardwörterbuch erstellen ...
Modell wird in den Dateicache /var/folders/st/b16fyn3s57x_5vszjl599njw0000gn/T/jieba.cache kopiert.
Das Laden des Modells dauerte 0,937 Sekunden.
Das Präfix-Wörterbuch wurde erfolgreich erstellt.
Out[2]: ['Hallo', 'Welt']

In [3]: jieba.lcut("hallo Welt")
Out[3]: ['hallo', ' ', 'Welt']

Bei allgemeinen Projekten kann der Volltextindex von MySQL 80 % der Anforderungen erfüllen. Er unterstützt perfekt die chinesische Suche, die automatische Wortsegmentierung, die Ergebnissortierung, kombinierte Abfragen und andere Funktionen. Der Engpass dürfte jedoch die Leistung sein. Elastissearch kann die Volltextsuche auf benutzerfreundliche Weise implementieren.

Mit der Volltextindizierung lässt sich der Effekt „Gefällt mir“ nicht erzielen, da zusammenhängende Sätze aufgrund der Wortsegmentierung mehrere Wörter bilden.

Verweise

Mysql Volltext

Oben finden Sie Einzelheiten zum Verwendungsbeispiel der MySQL-Volltextsuche. Weitere Informationen zur Verwendung der MySQL-Volltextsuche finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

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
  • Beispiel einer MySQL-Implementierung einer Volltextsuche und einer Methode zur Bewertung von Schlüsselwörtern
  • MySQL 5.7.25-Tutorial zur Volltextsuche

<<:  Detaillierte Erläuterung gängiger Methoden von JavaScript-Arrays

>>:  Detailliertes Tutorial zur schnellen Installation von Zookeeper in Docker

Artikel empfehlen

Unterscheidung zwischen Linux-Hardlinks und Softlinks

Unter Linux gibt es zwei Arten von Dateiverbindun...

Detaillierte Erläuterung verschiedener Speichermethoden von Docker-Containern

Inhaltsverzeichnis Vorne geschrieben Mehrere Spei...

Zusammenfassung von 6 Lösungen zur Implementierung des Singleton-Modus in JS

Vorwort Heute habe ich das Erzeugungsmuster im En...

Zusammenfassung der in MySQL häufig verwendeten Verkettungsanweisungen

Vorwort: In MySQL wird die Funktion CONCAT() verw...

MySQL 5.6.33 Installations- und Konfigurations-Tutorial unter Linux

In diesem Tutorial erfahren Sie alles über die In...

Containerisierungstransformation für Docker-Großprojekte

Virtualisierung und Containerisierung sind zwei u...

Praktische Optimierung des MySQL-Paging-Limits

Vorwort Wenn wir Abfrageanweisungen verwenden, mü...

Gängige Reparaturmethoden für die Trennung der MySQL Master-Slave-Replikation

Inhaltsverzeichnis 01 Problembeschreibung 02 Lösu...

MySQL 8.0.16 Installations- und Konfigurations-Tutorial unter Windows 10

In diesem Artikel finden Sie das grafische Tutori...