Rouven: LIKE vs. MATCH AGAINST

Hallo zusammen,

bitte eine kleine Antwort zum warm werden. Ich programmiere seit mehreren Jahren auf Datenbanken. Als ich bei einer Firma angefangen habe wurde ich vor vollendete Tatsachen gesetzt, soll heißen alle Suchabfragen waren mit LIKE-Abfragen auf indizierten Tabellen geschrieben. Ich kann im Moment leider nicht sagen, ob die Datenbank MATCH AGAINST nicht unterstützte oder ob es andere Gründe hat.
Nun sehe ich bei MySQL ständig FULLTEXT-indizierte Spalten und MATCH-AGAINST-Abfragen.
Könnte mir gerade mal jemand sagen für welchen Zweck sich was mehr eignet. (Ach ja, ich glaube eine Antwort LIKE IST MÜLL nützt mir nicht viel, es muss ja einen Grund geben warum die Funktion da ist.)

Danke für eure Kommentare!

Rouven

  1. Halihallo Rouven

    Nun sehe ich bei MySQL ständig FULLTEXT-indizierte Spalten und MATCH-AGAINST-Abfragen.
    Könnte mir gerade mal jemand sagen für welchen Zweck sich was mehr eignet. (Ach ja, ich glaube eine Antwort LIKE IST MÜLL nützt mir nicht viel, es muss ja einen Grund geben warum die Funktion da ist.)

    Fulltext-Searches funktionieren komplett anders, als Like-Searches. Es gibt kein
    eindeutiges Besser oder Schlechter, da jeder Search seine Stärken und Schwächen hat. Ein
    Fulltext-Index indiziert (fast) alle Wörter, ein normaler Index den ganzen Content des
    Feldes (ein LIKE ist besser für Abfragen zum _ganzen_ Content [wenn da kein % am Anfang
    steht, denn dann kann der Index nicht verwendet werden]). Ein Fulltext-Index ist
    sinnvoll, wenn du nach einzelnen Wörtern/-bestandteilen suchst. Die Ergebnisse werden
    auch ganz verschieden berechnet. LIKE durchsucht alle Daten und gibt alle passenden
    Resultate zurück, ein MATCH liefert alle passenden Resultate mit einer "Relevanz"
    zurück, der MATCH versucht also zu entscheiden, ob ein Resultat relevant oder nicht ist.
    Der Relevanzfaktor ist eine Fliesskommazahl, je höher, desto relevanter das Ergebnis.
    Ein LIKE bewertet den Inhalt nicht (was oftmals auch keinen Sinn macht; ist eben
    abhängig von der Aufgabenstellung).
    Fulltext-Searches entfalten ihre Stärke erst, wenn du sehr viele Dokumente durchforsten
    möchtest und die Ergebnisse noch nach Relevanz sortiert haben möchtest.
    LIKE-Searches sind sinnvoll bei sehr kleinen Datenbeständen und bei "nicht menschlichen
    Texten", wo die Relevanz nicht relevant ist und einfach nur das zurückgegeben werden
    soll, was auch wirklich passt.

    Beispiel:
    Du hast eine Tabelle Books, wo du Bücher speicherst:

    Books
    -----
       isbn
       author
       title

    Wenn du nun alle Büchertitel/Autoren- mit 'A' ausgeben möchtest, ist ein LIKE sinnvoller:

    SELECT * FROM Books WHERE author LIKE ("A%")

    hier kann der Index verwendet werden, eine "Relevanz" ist nicht relevant und ein
    Fulltext-Index macht keinen Sinn, da eh nur ein Wort/Tupel gespeichert wird.

    Falls du nun aber Dokumente speicherst und eine Suchmaschine realisieren willst, macht
    der Fulltext-Index/-Search viel mehr Sinn, aus genannten Gründen.

    http://www.mysql.com/doc/en/Fulltext_Search.html, dort steht alles relevante drin.

    Viele Grüsse

    Philipp

    1. Halihallo Rouven

      Fulltext-Index indiziert (fast) alle Wörter, ein normaler Index den ganzen Content des
      Feldes (ein LIKE ist besser für Abfragen zum _ganzen_ Content [wenn da kein % am Anfang
      steht, denn dann kann der Index nicht verwendet werden]). Ein Fulltext-Index ist
      sinnvoll, wenn du nach einzelnen Wörtern/-bestandteilen suchst.

      Vielleicht noch einige Worte zum Internen: Ein Fulltext-Index ist ein inverted index. Es
      werden also nicht die Inhalte einzelner Tupel (Datensätze) indiziert, sondern einzelne
      Bestandteile, welche in mehreren Tupeln vorkommen (z. B. Wörter in Dokumenten). Wenn du
      also nach einem kleinen Bestandteil suchst (z. B. 'hallo'), dann kann mysql im Fulltext
      Index zu 'hallo' nachsehen und bekommt so ganz schnell alle Dokumente, welches dieses
      Wort enthalten. Es geht also nicht darum Teile des Indexes zu matchen (wie in meinem
      Books Beispiel), sondern alle "Dokumente" zu finden, welche diesen Teil enthalten, dies
      geht mit einem inverted index wesentlich schneller (meistens ist es sogar der einzige
      Weg, um mit einem Index überhaupt arbeiten zu können).

      Viele Grüsse

      Philipp

      1. Hi Philipp,

        danke für die ausführliche Antwort - Um eine Verbindung zum anderen Teil des Threads herzustellen: Jawohl, auch hier gibt es schlaue Köpfe.
        Ich denke, dass mit dem "Dokument"-Inhalt vs. z.B. Autor als Inhalt ist schon der entscheidende Punkt, in der Firma suchen wir zumeist Teilenummern, da macht weder Relevanz einen Sinn noch irgend etwas anderes. Es geht lediglich darum ein WHERE x LIKE 'abc%' zu finden.
        Weiterhin weiß ich nicht ob DB2 MATCH unterstützt.

        Also, danke für die Antwort, das ist auf jedenfall weiter verwendbares Wissen für die nächsten Projekte !

        Rouven

  2. ich glaube das wie auch bei php js oder anderen sprachen der ausdruck zweimal existiert...

    aber ich würde etweder das mysql manual mal nach den beiden begriffen durchsuchen und vergleichen gibts ja auch auf deutsch...

    oder die frage im www.php4-forum.de stellen da sind verdammt schlaue köpfe und die wissen meißt eine antwort...

    mfg Till

    MATCH (col1,col2,...) AGAINST (expr)
    MATCH ... AGAINST() is used for full-text search and returns relevance - similarity measure between the text in columns (col1,col2,...) and the query expr. Relevance is a positive floating-point number. Zero relevance means no similarity. For MATCH ... AGAINST() to work, a FULLTEXT index must be created first. See section 6.5.3 CREATE TABLE Syntax. MATCH ... AGAINST() is available in MySQL Version 3.23.23 or later. For details and usage examples see section 6.9 MySQL Full-text Search.

    expr LIKE pat [ESCAPE 'escape-char']
    Pattern matching using SQL simple regular expression comparison. Returns 1 (TRUE) or 0 (FALSE). With LIKE you can use the following two wild-card characters in the pattern:

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

    1. Halihallo Till

      oder die frage im www.php4-forum.de stellen da sind verdammt schlaue köpfe und die wissen meißt eine antwort...

      und warum bist du noch hier?

      Viele Grüsse

      Philipp

      1. moinsen Philipp

        und warum bist du noch hier?

        meine du nicht das das eine sehr unqualifizierte frage ist?

        so nur mal nebenbei bemerkt :D

        ich das php4 forum ist wie man sieht nur für php/mysql fragen

        1. Halihallo Till

          und warum bist du noch hier?
          meine du nicht das das eine sehr unqualifizierte frage ist?

          Um einer derartige Frage zu stellen braucht man keine Qualifikation, du hast recht, sie diente auch einem anderen Zweck:
          Ich wollte dich darauf aufmerksam machen, dass _deine_ Aussage nicht "qualifiziert" ist. Sie hat keinem Zweck. Erstens ist es genauso rechtfertigbar, dass Rouven seine Frage in _diesem_ Forum stellt und nicht in deinem preferierten (beide sind nicht primär für mysql Fragen), zweitens gibt es auch hier durchaus "verdammt schlaue köpfe und die wissen meißt eine antwort".
          Es ist ja gut, wenn du andere durch Links auf gute Seiten/Foren helfen möchtest, aber in diesem Kontext halte ich es für deplatziert.

          Viele Grüsse

          Philipp

  3. Hallo,

    bitte eine kleine Antwort zum warm werden. Ich programmiere seit mehreren Jahren auf Datenbanken. Als ich bei einer Firma angefangen habe wurde ich vor vollendete Tatsachen gesetzt, soll heißen alle

    Suchabfragen waren mit LIKE-Abfragen auf indizierten Tabellen geschrieben. Ich kann im Moment leider nicht sagen, ob die Datenbank MATCH AGAINST nicht unterstützte oder ob es andere Gründe hat.

    MATCH AGAINST unterstützen afaik nicht viele Datenbank, wenn mySQL nicht am Ende die einzige ist.

    LIKE ist dagegen Bestandteil von Standard-SQL und sollte iegentlich von jeder SQL-fähigen Datenbank unterstützt werden.

    Solltest Du beispielsweise gezwungen sein, die Abfragen DBMS-unabhängig zu schreiben, wird Dir wohl nichts anderes übrig bleiben, als LIKE zu verwenden. Dabei könnte es zwar zu mehr Einschränkungen bei einem speziellen DBMS kommen, allerdinsg wäre das eben der Preis für die System-Unabhängigkeit.

    Welche Vorteile udn Nachteile MATCH AGAINST wirklich hat, kann ich nicht beurteilen, da ich i.d.R. nicht mit mySQL arbeite und es nur am Rande kenne.

    Grüße
      Klaus