mic: FULLTEXT-Suche nach abcd$efg

hi,

ich habe ein mysql-abfrage nach dem muster:

abcd$efgh

SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ( abcd$efg' IN BOOLEAN MODE );

das problem ist, dass sql abcd$efg scheinbar in abcd efgh umwandelt und somit nach abcd ODER efg sucht, was mir gar nicht hilft. gibt man "abcd$efg" erhalt somit nur die datensaätze in denen abcd vorkommt weil egf ja, weil < 4 buchstaben, stopword ist.

weiss jemand ein lösong wie man nach einem string suchen kann der ein sonderzeichen $, § etc. enthält?

danke für die anstrengungen

mic

  1. yo,

    SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ( abcd$efg' IN BOOLEAN MODE );

    das fehlende erste ' des strings ist nur ein tippfehler und du benutzt nicht zufällig php, wo das $ als variable erkannt wird ?

    Ilja

    1. das fehlende ' war grad nur ein tippfehler hier im forum. der $ hat nichts mmit php zu tun. das ist der befehl den ich direkt so in die db gebe:

      SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ( 'abcd$efg' IN BOOLEAN MODE );

      außerdem passiert das selbe wenn ic anstatt $ ein § mache...

      mic

      1. yo,

        $ ist meiner ansicht nach kein sonderzeichen bei mysql, um so mehr verwundert mich diese sonderbehandlung des zeichens. bei regulären ausdrücken kennzeichnet das $ das ende eines strings, vielleicht kommt er damit durcheinander, aber alles nur eine vermutung von mir. deshalb versuch einfach mal das sonderzeichen als normales zeichen mit den \ kenntlich zu machen.

        'abcd$efg'

        Ilja

        1. $ ist meiner ansicht nach kein sonderzeichen bei mysql, um so mehr verwundert mich diese sonderbehandlung des zeichens.

          mic hats auch verwundert.

          deshalb versuch einfach mal das sonderzeichen als normales zeichen mit den \ kenntlich zu machen.

          'abcd$efg'

          hab ich schon geht aber leider auch net. ob es ein sonderzeichen ist oder nicht ist eigentlich auch egal. es ist nämlich so, dass mysql alles bei der indizierung als ein wort anerkennt, was

          A 4 oder mehr buchstaben
          B und durch _ verbunden ist

          also wenn abcd§fgh gesucht wird, sucht er nach abcd, §, fgh. und weil nur abcd Bedingung A erfüllt findet er alles mit abcd. und das ist in meinem fall ein wor dass praktisch in jedem datensatz vorkommt. also ist die ganze db nbrauchbar...

          ÄRGERLICH!!!!

          es müsste eine möglichkeite geben, Bedingung B mit § zu erweitern...

          gruß

          mic

          1. was passiert den, wenn due das den boolen mode weglässt, also

            SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ('abcd$efg');

            gleiches ergebnis ?

            Ilja

            1. was passiert den, wenn due das den boolen mode weglässt, also

              SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ('abcd$efg');

              gleiches ergebnis ?

              jupp, genau die selbe SCH***E und +, -, * etc. gehen net. was natürlich auch net klar gwehen würde...

              was nun? man muss doch nach zB gestzen suchen können stpo§24 oder so...

  2. Halihallo mic

    das problem ist, dass sql abcd$efg scheinbar in abcd efgh umwandelt und somit nach abcd ODER efg sucht, was mir gar nicht hilft. gibt man "abcd$efg" erhalt somit nur die datensaätze in denen abcd vorkommt weil egf ja, weil < 4 buchstaben, stopword ist.

    1. Falls du eine Sprache vierter Generation verwendest (PHP,Perl)
         ist die Wahrscheinlichkeit gross, dass abcd$efg in abcd +
         Variableninhalt der Variable $efg aufgelöst wird und somit nicht
         der Zeichenfolge 'abcd$efg' entspricht. Abhilfe schafft Ausgeben
         des Queries.
    2. Aus der Dokumentation von http://www.mysql.com/doc/en/Fulltext_Search.html
      lässt sich ableiten, dass:

    <cite>
    MySQL uses a very simple parser to split text into words. A word'' is any sequence of characters consisting of letters, digits, `'', and `\_'. Any word'' that is present in the stopword list or is just too short is ignored. The default minimum length of words that will be found by full-text searches is four characters. This can be changed as described in section 6.8.2 Fine-tuning MySQL Full-text Search.
    </cite>

    ein "Wort" definiert ist als eine Zeichenfolge aus Buchstaben,
    Ziffern, "'" und "_". Nun, ein Fulltext-Search arbeitet auf dieser
    Wortebene und somit liesse sich eine Volltextsuche nach dem
    _Wort_ "abcd$efg" nicht ohne ändern des Sourcecodes realisieren.
    Natürlich könntest du mit field LIKE "%abcd$efg%" arbeiten, wobei
    dies vielleicht nicht in deinem Interesse (besonders nicht im
    Interesse der Performance) liegt.

    weiss jemand ein lösong wie man nach einem string suchen kann der ein sonderzeichen $, § etc. enthält?

    IMHO ist ein LIKE/RLIKE oder ähnliche
    (http://www.mysql.com/doc/en/String_comparison_functions.html)
    Funktion die einzige Möglichkeit (wenn auch nicht vorteilhaft bzgl.
    Performance).

    Viele Grüsse

    Philipp