Hallo User,
ich bin an der Entwicklung eines DB-Frontend beteiligt. In diesem kann eine Textsuche, die der User eingibt, über mehrere Spalten einer Tabelle durchgeführt werden. Dazu benutze ich die optimierte Volltextsuche von MySQL mit Match Against. Hierbei trudelte von den Usern ein Bug ein, dass damit nicht nach Strings mit Sonderzeichen gesucht werden kann.
Also, es existieren Einträge, dieser Art: "...Prüfe => SD->DAB, wenn..."
Nun soll nach Einträgen mit "->DAB" gesucht werden; Match Against kommt mit empty set zurück. Hier die Query:
SELECT *
FROM TableName
WHERE MATCH (Spalte1,Spalte2,Spalte3)
AGAINST ('->DAB' )
;
Spalte1,Spalte2,Spalte3 sind FULLTEXT indiziert.
Ich vermute, dass die Volltextsuche die Sonderzeichen ignoriert (oder fehlinterpretiert) und "DAB" durch die 4 Zeichengrenze fällt. Aber warum kann man nicht nach Strings mit Sonderzeichen wie "#" oder "-" oder "<" suchen? Hierzu habe ich bereits das MySQL-Handbuch gewälzt und Mr. Google befragt - lässt mich allerdings im dunkeln...
Die Suche mit "REGEXP" oder "LIKE" funktioniert zwar, aber es sollte doch prinzipiell auch mit der implementierten Volltextsuche funktionieren?! Ich möchte gern die MATCH AGAINST Suche benutzen, um zukünftig bei vielleicht millionen Einträgen halbwegs performant zu bleiben. Ich möchte auch nicht unbedingt irgendein workaround à la "wenn Sonderzeichen, dann REGEXP nutzen" implementieren.
Was habe ich bereits probiert:
-> Sonderzeichen mit "\" escaped
-> IN BOOLEAN MODE zusätzlich benutzt
-> BINARY oder ESCAPE verwendet
hier meine Daten:
MySQL: 5.0.51
MySQL-Zeichensatz: UTF-8 Unicode (utf8)
Kollation der MySQL-Verbindung: utf8_unicode_c
Tabellen-Typ: MyISAM
Vielleicht hattet ihr schon mal das gleiche Problem? Kann man eventuell eine MySQL-Lauzeitvariable (z.Bsp. mysql_real_escape_string()) verändern, damit die Sonderzeichen erkannt/escaped werden? Wäre für Hilfe dankbar!
Grüße
techniBob
ich bin an der Entwicklung eines DB-Frontend beteiligt. In diesem kann eine Textsuche, die der User eingibt, über mehrere Spalten einer Tabelle durchgeführt werden. Dazu benutze ich die optimierte Volltextsuche von MySQL mit Match Against. Hierbei trudelte von den Usern ein Bug ein, dass damit nicht nach Strings mit Sonderzeichen gesucht werden kann.
Also, es existieren Einträge, dieser Art: "...Prüfe => SD->DAB, wenn..."
Nun soll nach Einträgen mit "->DAB" gesucht werden; Match Against kommt mit empty set zurück. Hier die Query:
SELECT *
FROM TableName
WHERE MATCH (Spalte1,Spalte2,Spalte3)
AGAINST ('->DAB' )
;
Spalte1,Spalte2,Spalte3 sind FULLTEXT indiziert.
Ich vermute, dass die Volltextsuche die Sonderzeichen ignoriert (oder fehlinterpretiert) und "DAB" durch die 4 Zeichengrenze fällt. Aber warum kann man nicht nach Strings mit Sonderzeichen wie "#" oder "-" oder "<" suchen? Hierzu habe ich bereits das MySQL-Handbuch gewälzt und Mr. Google befragt - lässt mich allerdings im dunkeln...
Die Suche mit "REGEXP" oder "LIKE" funktioniert zwar, aber es sollte doch prinzipiell auch mit der implementierten Volltextsuche funktionieren?! Ich möchte gern die MATCH AGAINST Suche benutzen, um zukünftig bei vielleicht millionen Einträgen halbwegs performant zu bleiben. Ich möchte auch nicht unbedingt irgendein workaround à la "wenn Sonderzeichen, dann REGEXP nutzen" implementieren.
Was habe ich bereits probiert:
-> Sonderzeichen mit "\" escaped
-> IN BOOLEAN MODE zusätzlich benutzt
-> BINARY oder ESCAPE verwendet
hier meine Daten:
MySQL: 5.0.51
MySQL-Zeichensatz: UTF-8 Unicode (utf8)
Kollation der MySQL-Verbindung: utf8_unicode_c
Tabellen-Typ: MyISAM
Vielleicht hattet ihr schon mal das gleiche Problem? Kann man eventuell eine MySQL-Lauzeitvariable (z.Bsp. mysql_real_escape_string()) verändern, damit die Sonderzeichen erkannt/escaped werden? Wäre für Hilfe dankbar!
Grüße
techniBob
Comment