Antwort
von phpbuddy am 03.02.2020, 11.34 Uhr
Hier eine funktionierende und getestete Lösung z.B. für die aktuelle Version MySQL Server 8.0.19 unter Windows 10.
1. Den aktuellen Wert der Variable ft_min_word_len abfragen:
mysql> SHOW VARIABLES LIKE 'ft_min_word_len';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| ft_min_word_len | 4 |
+-----------------+-------+
Mit dem Wert ft_min_word_len=4 kann man nicht nach 2-char Wörtern wie "A3" suchen. Den Wert setzen wir deshalb in den folgenden Schritten auf 2.
2. Den Befehl services.msc aufrufen und den Service MySQL80 unter Windows stoppen, um die MySQL-Config zu ändern.
3. Den Pfad zur Configdatei my.ini unter Eigenschaften des MySQL80 Service (services.msc) identifizieren und die Configdatei my.ini (z.B. "C:\ProgramData\MySQL\MySQL Server 8.0\my.ini") wie folgt editieren, um die minimale Wortlänge bei Volltextsuche auf 2 zu setzen:
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
4. Den Service MySQL80 unter Windows (services.msc) wieder starten und den Wert ft_min_word_len=2 prüfen:
mysql> SHOW VARIABLES LIKE 'ft_min_word_len';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| ft_min_word_len | 2 |
+-----------------+-------+
5. In der MySQL-Tabelle musst Du nun die FULLTEXT-Indizes neu bilden. Wir erstellen stattdessen eine neue Tabelle, um die Suche nach den beiden Wörtern wie "Audi" und "A3" an einem Beispiel zu demonstrieren (proof of concept).
mysql> CREATE TABLE PKW (
id INT NOT NULL AUTO_INCREMENT,
modell VARCHAR(255) NOT NULL,
beschreibung TEXT,
PRIMARY KEY (id),
FULLTEXT KEY (beschreibung)
);
INSERT INTO pkw(modell,beschreibung)
VALUES('Audi A1x','Das ist Audi Modell A1x bla bla bla ...');
INSERT INTO pkw(modell,beschreibung)
VALUES('Audi A2x','Das ist Audi Modell A2x bla bla bla ...');
INSERT INTO pkw(modell,beschreibung)
VALUES('Audi A3x','Das ist Audi Modell A3x bla bla bla ...');
INSERT INTO pkw(modell,beschreibung)
VALUES('Audi A1','Das ist Audi Modell A1 textbeschreibung1 ...');
INSERT INTO pkw(modell,beschreibung)
VALUES('Audi A2','Das ist Audi Modell A2 textbeschreibung2 ...');
INSERT INTO pkw(modell,beschreibung)
VALUES('Audi A3','Das ist Audi Modell A3 textbeschreibung3 ...');
mysql> SELECT * FROM pkw;
+----+----------+----------------------------------------------+
| id | modell | beschreibung |
+----+----------+----------------------------------------------+
| 1 | Audi A1x | Das ist Audi Modell A1x bla bla bla ... |
| 2 | Audi A2x | Das ist Audi Modell A2x bla bla bla ... |
| 3 | Audi A3x | Das ist Audi Modell A3x bla bla bla ... |
| 4 | Audi A1 | Das ist Audi Modell A1 textbeschreibung1 ... |
| 5 | Audi A2 | Das ist Audi Modell A2 textbeschreibung2 ... |
| 6 | Audi A3 | Das ist Audi Modell A3 textbeschreibung3 ... |
+----+----------+----------------------------------------------+
6. Suche nach den Einträgen mit den beiden Wörtern "Audi" und "A3" (Beispiele):
Suche nach allen Einträgen, die die beiden Wörter "Audi" und "A3" enthalten:
mysql> select * from pkw where
(match(beschreibung) against('+a3' IN BOOLEAN MODE) AND
match(beschreibung) against('+audi' IN BOOLEAN MODE));
+----+---------+----------------------------------------------+
| id | modell | beschreibung |
+----+---------+----------------------------------------------+
| 6 | Audi A3 | Das ist Audi Modell A3 textbeschreibung3 ... |
+----+---------+----------------------------------------------+
Suche nach allen Einträgen, die die beiden Wörter "Audi" und "A2" enthalten:
mysql> select * from pkw where
(match(beschreibung) against('+a2' IN BOOLEAN MODE) AND
match(beschreibung) against('+audi' IN BOOLEAN MODE));
+----+---------+----------------------------------------------+
| id | modell | beschreibung |
+----+---------+----------------------------------------------+
| 5 | Audi A2 | Das ist Audi Modell A2 textbeschreibung2 ... |
+----+---------+----------------------------------------------+
Suche nach allen Einträgen, die die beiden Wörter "Audi" und "A1" enthalten:
mysql> select * from pkw where
(match(beschreibung) against('+a1' IN BOOLEAN MODE) AND
match(beschreibung) against('+audi' IN BOOLEAN MODE));
+----+---------+----------------------------------------------+
| id | modell | beschreibung |
+----+---------+----------------------------------------------+
| 4 | Audi A1 | Das ist Audi Modell A1 textbeschreibung1 ... |
+----+---------+----------------------------------------------+
Der Eintrag mit "Audi Modell A3x" in der Beschreibung wurde bei der Suche nach "Audi" und "A3" ignoriert, weil "A3x" zwar den Kontext "A3" enthält, jedoch kein Wort "A3" ist.
Wie diese Beispiele zeigen, funktioniert die vorgeschlagene Lösung zur Volltextsuche nach den beiden Wörtern wie "Audi" und "A3".