Andreas-Lindig: SUCHWORT_anderesWort mit match() im mySQL suchen

Hallo Forum,

Ich bin gerade dabei meine eigene Forums-Suche weitgehend Sonderzeichenresistent zu machen und jetzt dies: nimm an, Du suchst das Wort SUCHWORT. In einem Posting kommt es so vor: SUCHWORT_andereswort. Wenn ich das nun in mySQL so suche

select * from tabelle
where match(suchspalte) against ('SUCHWORT')

dann wird es nicht gefunden, weil _ und ' von match() auch als zulässige Zeichen in einem Wort betrachtet werden. SUCHWORT wird also als Teil eines Wortes nicht erkannt. Ebenso passiert es z.B. mit Onkel Tom's Hütte, wobei Tom mein SUCHWORT sein soll.

URGHHHMPF!

Nun könnte ich natürlich mit RLIKE suchen und das funktioniert auch, nur: Ich kann meinem PHP-Script nicht mitteilen, wann es denn mit RLIKE und wann mit match() suchen soll. Ich will natürlich sooft wie möglich mit match() suchen, um Resourcen zu sparen, aber ob mein SUCHWORT nun durch _ bzw. ' von einem zweiten Teilwort getrennt wird kann ich ja frühestens _nach_ der Suche rausfinden.

Wie kann ich also SUCHWORT_andereswort finden ohne standardmäßig mit RLIKE oder LIKE zu suchen?

Gruß, Andreas

--
<img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
http://was-ist-das.andreas-lindig.de
  1. Hallo,

    Ich bin gerade dabei meine eigene Forums-Suche weitgehend Sonderzeichenresistent zu machen und jetzt dies: nimm an, Du suchst das Wort SUCHWORT. In einem Posting kommt es so vor: SUCHWORT_andereswort. Wenn ich das nun in mySQL so suche

    select * from tabelle
    where match(suchspalte) against ('SUCHWORT')

    dann wird es nicht gefunden,
    Wie kann ich also SUCHWORT_andereswort finden ohne standardmäßig mit RLIKE oder LIKE zu suchen?

    Das kommt auf die MySQL-Version an. Seit 4.0.1 geht:

    SELECT suchspalte FROM tabelle
    WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);

    http://www.mysql.com/doc/en/Fulltext_Search.html

    Warum SELECT * schlecht ist, weißt Du hoffentlich?

    viele Grüße

    Axel

    1. Hallo Axel,

      Das kommt auf die MySQL-Version an. Seit 4.0.1 geht:

      SELECT suchspalte FROM tabelle
      WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);

      http://www.mysql.com/doc/en/Fulltext_Search.html

      dankeschön, erstmal lesen.

      Warum SELECT * schlecht ist, weißt Du hoffentlich?

      nö. War zwar nur'n Beispiel, ich suche in echt nur

      SELECT ID...

      aber interessieren tut es mich trotzdem: warum?

      Gruß, Andreas

      --
      <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
      http://was-ist-das.andreas-lindig.de
      1. Hallo Andreas,

        Warum SELECT * schlecht ist, weißt Du hoffentlich?
        nö. War zwar nur'n Beispiel, ich suche in echt nur

        SELECT ID...

        aber interessieren tut es mich trotzdem: warum?

        http://www.dclp-faq.de/q/q-sql-select.html

        viele Grüße

        Axel

    2. Das kommt auf die MySQL-Version an. Seit 4.0.1 geht:

      SELECT suchspalte FROM tabelle
      WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);

      wenn ich das richtig verstehe und meine Tests richtig sind, kann ich damit nur SUCHWORT_... suchen, aber nicht ..._SUCHWORT gell? Weißt Du dafür auch noch einen Rat?

      Gruß, Andreas

      --
      <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
      http://was-ist-das.andreas-lindig.de
      1. Hallo,

        SELECT suchspalte FROM tabelle
        WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);

        wenn ich das richtig verstehe und meine Tests richtig sind, kann ich damit nur SUCHWORT_... suchen, aber nicht ..._SUCHWORT gell?

        Ja. Fulltext-Suche basiert auf einem Fulltext-Index. Bei Dir müsste das in der Tabelle "tabelle" der Index FULLTEXT(suchspalte) sein.

        Wie ein Index funktioniert weißt Du?

        Dann ist Dir auch klar, dass _kein_ Index soetwas wie: *SUCHWORT oder *SUCHWORT* abdecken kann. Ein Index kann _nur_ SUCHWORT* abdecken.

        Weißt Du dafür auch noch einen Rat?

        Ja.

        SELECT suchspalte FROM tabelle WHERE suchspalte LIKE '%SUCHWORT%';

        Performanter geht _das_, meiner Meinung nach, nicht.

        viele Grüße

        Axel

        1. Wie ein Index funktioniert weißt Du?

          ja, in etwa...

          Dann ist Dir auch klar, dass _kein_ Index soetwas wie: *SUCHWORT oder *SUCHWORT* abdecken kann.

          okeeokee...;)

          SELECT suchspalte FROM tabelle WHERE suchspalte LIKE '%SUCHWORT%';

          Performanter geht _das_, meiner Meinung nach, nicht.

          schönschön, nur - wie ich eingans schon schrieb - Ich kann nicht voraussehen, ob ein SUCHWORT in dieser Stellung: ..._SUCHWORT vorkommt. Also müßte ich in dieser Variante _von vornherein_ mit LIKE oder RLIKE suchen. Aber ich will das ja möglichst vermeiden.

          Gruß, Andreas

          --
          <img src="http://was-ist-das.andreas-lindig.de/was_ist_das_fetzen.jpg" border="0" alt="">
          http://was-ist-das.andreas-lindig.de