Philipp Hasenfratz: LIKE vs. MATCH AGAINST

Beitrag lesen

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