MySQL Cookbook by

Discussion

Um Datensätze zu finden, die eine bestimmte Phrase enthalten, können Sie keine einfache FULLTEXTSuche verwenden:

mysql>  -> +----------+| COUNT(*) |+----------+| 548 |+----------+

Die Abfrage gibt ein Ergebnis zurück, aber es ist nicht das Ergebnis, nach dem Sie suchen. Bei einer FULLTEXTSuche wird eine Relevanzeinstufung auf der Grundlage des Vorhandenseins jedes einzelnen Wortes berechnet, unabhängig davon, wo es in der Spalte vtext vorkommt, und die Einstufung ist ungleich Null, solange eines der Wörter vorhanden ist. Folglich neigt diese Art der Abfrage dazu, zu viele Datensätze zu finden.

Ab MySQL 4.0.2 unterstützt die FULLTEXTSuche die Phrasensuche im booleschen Modus. Um sie zu verwenden, setzen Sie den Ausdruck einfach in doppelte Anführungszeichen.

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Vor 4.0.2 ist eine Umgehung erforderlich. Sie könnten eineIN BOOLEANMODE-Suche verwenden, um zu verlangen, dass jedes Wort vorhanden sein muss, aber das löst das Problem nicht wirklich, da die Wörter immer noch in beliebiger Reihenfolge vorkommen können:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 3 |+----------+

Wenn Sie stattdessen eine SQL-Musterübereinstimmung verwenden, erhalten Sie das richtige Ergebnis:

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Die Verwendung einer SQL-Musterübereinstimmung ist jedoch wahrscheinlich langsamer als eineFULLTEXT-Suche. Sie haben also die unangenehme Wahl zwischen einer Methode, die schneller ist, aber nicht die gewünschten Ergebnisse liefert, und einer Methode, die zwar richtig funktioniert, aber langsamer ist. Glücklicherweise sind das nicht die einzigen Optionen. Sie können beide Methoden in derselben Abfrage kombinieren:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Damit erhalten Sie das Beste aus beiden Arten des Abgleichs:

  • Mit dem Ausdruck MATCH( ) kann MySQL eine Suche nach FULLTEXT durchführen, um eine Reihe von Kandidatenzeilen zu erzeugen, die Wörter in der Phrase enthalten. Dies schränkt die Suche erheblich ein.

  • Mit dem SQL-Mustertest kann MySQL die Kandidatenzeilen durchsuchen, um nur die Datensätze zu erzeugen, die alle Wörter in der richtigen Reihenfolge enthalten.

Diese Technik schlägt fehl, wenn alle Wörter kürzer sind als die Mindestwortlänge des Indexierungsprogramms oder in mehr als der Hälfte der Datensätze vorkommen. In diesem Fall gibt die FULLTEXTSuche überhaupt keine Datensätze zurück. Sie können die Datensätze mit einemSQL-Mustervergleich finden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.