malnefrage.de
malnefrage.de
Menü
Facebook
Twitter
E-Mail
Bookmark
weitere
Ratgeber-Community für Fragen & Antworten:
Forum mit Tipps, Hilfe und Ratschläge
Forum Frage stellen! Neue Fragen Neue Antworten Login
Frage
Frage
von Mqrtin am 13.10.2017, 15.13 Uhr

MySQL Vollstextsuche mit 3 Zeichen?

Wie kann man in MySQL eine Volltextsuche mit 3 Zeichen realisieren? Ich versuche über MATCH AGAINST eine MySQL-Volltextsuche über den FULLTEXT Index der Datenbank laufen zu lassen. Leider erfolglos!
SELECT * FROM hersteller
WHERE MATCH (hersteller) AGAINST ("Mercedes","BMW","Audi")
Bsp: Wenn ich nach "Mercedes" suche funktioniert es, suche ich allerdings nach "BMW" ergibt die Suche keine Ergebnisse!

Die minimale Wortlänge für eine MySQL-Volltextsuche scheint aufgrund der Performance der Datenbank 4 Zeichen zu betragen. Wie kann ich das ändern? Ich möchte eine Volltextsuche mit MySQL für nur 3 Zeichen lange Begriffe ausführen um auch nach kürzeren Wörtern suchen zu können.

Wahrscheinlich kann man das nur in der Konfigurationsdatei von MySQL (my.cnf) ändern? Welchen Parameter muss man in der Datei my.cnf anpassen, damit die Volltextsuche unter MySQL auch nur mit 3 Zeichen funktioniert?

Da man bei gemietetem Webspace keinen Zugriff auf die Konfiguration von MySQL hat, ist es auch ohne Änderung der my.cnf Datei möglich eine MATCH AGAINST Volltextsuche nach Begriffen mit nur 3 Zeichen durchzuführen? Gibt es vielleicht einen Workaround?

Antwort
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".


Antwort
Antwort
von Sec30gt am 25.10.2017, 10.49 Uhr
Deine Abfrage ist grundsätzlich korrekt, leider lässt sich diese Abfrage wie von dir gewünscht mit der MySQL Volltextsuche nicht durchführen weil, wie deine Ergebnisse schon verraten, lediglich "Audi" Treffer ausgegeben werden und deine Suche nach "A3" ignoriert wird.
Das liegt schlicht und ergreifend daran, dass die Volltextsuche eine Mindestzeichenlänge von 4 benötigt. Daher wird Audi (=4) gefunden und A3 (=2) nicht.

Weitere Möglichkeiten:

Mit MATCH AGAINST nur nach Audi suchen und mit Hilfe von PHP im Ergebnis nach "A3" suchen. Oder:

Logischer Operator "AND":
WHERE beschreibung = 'Audi' AND (beschreibung LIKE '%A3%');
Die Such-Parameter können beliebig erweitert werden.

Beispielsweise um die Farbe: (beschreibung LIKE '%A3%' AND beschreibung LIKE '%rot%')
Alternativ kann in den Klammern auch mit OR gearbeitet werden: (beschreibung LIKE '%A3%' AND beschreibung LIKE '%rot%' OR beschreibung LIKE '%blau%')

Arbeiten mit LIKE:
WHERE beschreibung LIKE '%Audi%' AND (beschreibung LIKE '%A3%');
Oder IN Operator:
WHERE `beschreibung` IN ('audi','a3');
Wie gesagt, viele Wege führen zum Ziel, allerdings ist auch immer die korrekte Klammersetzung zu beachten, sonst gibt es fehlerhafte Ausgaben!
Ähnliche Fragen
Hi, kann mir jemand verraten wie ich mit PHP das letzte Zeichen am Ende einer Zeichenkette entfernen kann? Ich hole mir aus einer MySQL-Datenbank ...
Hallo, mein Problem ist das der MySQL Server nicht mehr startet. Ich habe auf einem Windows 10 Rechner zu Testzwecken XAMPP installiert. Bis gestern hat ...
Wie kann man die aktuelle MySQL Datenbank Version herausfinden? Wo kann ich schauen welche Version von MySQL auf dem Server läuft und wo die Datenbank ...
Wie kann ich mich beim MySQL Server auf der Konsole unter Linux anmelden? Ich habe mich per SSH auf meinem Root Server angemeldet. Wie kann ich mich nun ...
Wahrscheinlich bin ich einfach nur zu blöd, aber sagt mal, wo finde ich auf einem Android Smartphone das Paragraph-Zeichen auf der Gboarb Tastatur? Benutze ...
Nächste Frage

Die auf malnefrage.de veröffentlichten Fragen und Antworten sind Meinungsäußerungen der jeweiligen User. Da die Aussagen nicht geprüft werden, kann die Richtigkeit der Inhalte nicht gewährleistet werden.