Announcement

Collapse
No announcement yet.

Sonderzeichen in MATCH AGAINST

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sonderzeichen in MATCH AGAINST

    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

  • #2
    Hallo,
    Originally posted by techniBob View Post
    ...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...
    So ähnlich ist es auch. Genauer gesagt liegt es daran, dass solche "Sonderzeichen" wie +, -, < eben keine Buchstaben sind und somit nicht als Bestandteil eines Wortes sondern als eigenständiges Wort interpretiert werden. Jedes "Wort" deines Suchstrings für sich ist dann natürlich zu kurz.

    Abhilfe für solche speziellen Fälle erläutert das MySQL Handbuch aber schon. Und zwar im Kapitel: 11.8.6. Fine-Tuning MySQL Full-Text Search
    Dort steht bspw.:
    If you want to change the set of characters that are considered word characters, you can do so in two ways. Suppose that you want to treat the hyphen character ('-') as a word character. Use one of these methods:

    * Modify the MySQL source: In myisam/ftdefs.h, see the true_word_char() and misc_word_char() macros. Add '-' to one of those macros and recompile MySQL.

    * Modify a character set file: This requires no recompilation. The true_word_char() macro uses a “character type” table to distinguish letters and numbers from other characters. . You can edit the contents of the <ctype><map> array in one of the character set XML files to specify that '-' is a “letter.” Then use the given character set for your FULLTEXT indexes.

    * Add a new collation for the character set used by the indexed columns, and alter the columns to use that collation.
    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hey,
      vielen Dank Falk. Hatte den Abschnitt "12.7.5. MySQL-Volltextsuche feineinstellen" auch gelesen und gehofft, dass ich um so eine Modifizierung drumherum komme Dachte, es gibt vielleicht eine Variable, die man einfach auf "true" setzt und den Server neu startet, oder vielleicht zur Laufzeit ändern kann. Schade. Naja, ich werde mal die Variante ohne Neukompilierung ausprobieren... Ein Escape-Zeichen bzw. -Anweisung wäre zu schön gewesen

      Danke dir.

      Comment

      Working...
      X