LIKE vs. MATCH AGAINST
Rouven
- datenbank
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
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
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
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
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
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
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
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
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