Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Volltextsuche in MySQL:Das Gute, das Schlechte und das Hässliche

Manchmal möchten Sie beim Suchen in einer MySQL-Datenbank Volltextsuchabfragen für zeichenbasierte Daten ausführen. Heute diskutieren wir die Vor- und Nachteile solcher Suchmethoden.

Was sind Volltextsuchen in MySQL?

Die Volltextsuche ist eine Technik, mit der Sie nach Datensätzen suchen können, die möglicherweise nicht genau den Suchkriterien entsprechen. Volltextsuchen in MySQL werden durchgeführt, wenn bestimmte Indizes verwendet werden und diese Indizes viele einzigartige Nuancen aufweisen, einschließlich der folgenden:

  • Damit der Index als Volltextindex betrachtet wird, muss der Index vom Typ FULLTEXT sein.
  • FULLTEXT-Indizes können nur auf Tabellen verwendet werden, auf denen die InnoDB- oder MyISAM-Speicher-Engines ausgeführt werden.
  • FULLTEXT-Indizes können nur für CHAR-, VARCHAR- oder TEXT-Spalten erstellt werden.
  • FULLTEXT-Indizes werden nur verwendet, wenn die MATCH() AGAINST()-Klausel verwendet wird.
  • Volltextsuchen haben drei Modi:den natürlichen Sprachmodus, den booleschen Modus und den Abfrageerweiterungsmodus.

Ein FULLTEXT-Index ist ein spezieller Indextyp, der Schlüsselwörter im Text findet, anstatt die Werte mit den Werten im Index zu vergleichen. Obwohl sich die FULLTEXT-Suche von anderen Arten der Übereinstimmung unterscheidet, beachten Sie, dass Sie gleichzeitig einen BTREE-Index und einen FULLTEXT-Index für dieselbe Spalte haben können - sie werden nicht miteinander in Konflikt geraten, da sie für unterschiedliche Zwecke geeignet sind.

Volltext-Suchtypen

Beachten Sie beim Ausführen von Volltextsuchen in MySQL, dass es drei Suchtypen gibt, aus denen Sie wählen können:

  1. Ein Suchtyp in natürlicher Sprache – ein solcher Suchmodus interpretiert die Suchzeichenfolge als wörtliche Phrase. Standardmäßig aktiviert, wenn kein Modifikator angegeben ist oder wenn der Modifikator IN NATURAL LANGUAGE MODE angegeben ist;
  2. Ein Suchtyp zur Erweiterung der Abfrage - ein solcher Suchmodus führt die Suche zweimal durch. Bei der zweiten Suche enthält die Ergebnismenge einige der relevantesten Dokumente aus der ersten Suche. Aktiviert mit dem Modifikator WITH QUERY EXPANSION;
  3. Ein boolescher Suchtyp – ein solcher Suchmodus ermöglicht die Suche nach komplexen Abfragen, die boolesche Operatoren wie Kleiner-als-Operatoren ("<") und Mehr-als-Operatoren (">"), Unterausdrücke ("( ” und “)”), das Pluszeichen (+), das Minuszeichen (-), doppelte Anführungszeichen (“”), ein Operator, der den Beitrag des Werts zu den Ergebnissen verringert (~) und der Platzhalteroperator (*) - the Der Wildcard-Operator ermöglicht die Suche mit Fuzzy-Matching (z. B. würde „Demo*“ auch mit „Demonstration“ übereinstimmen). Aktiviert mit dem Modifikator IN BOOLEAN MODE.

Volltextsuche mit dem Natural Language Search Mode

Ein Suchmodus in natürlicher Sprache, wie oben erwähnt, ist standardmäßig aktiviert oder wenn der Modifikator IN NATURAL LANGUAGE MODE angegeben ist. Dieser Modus führt eine Suche in natürlicher Sprache anhand einer bestimmten Textsammlung (eine oder mehrere Spalten) durch. Das grundlegende Abfrageformat von Volltextsuchen in MySQL sollte dem Folgenden ähneln:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

Wenn MATCH() zusammen mit einer WHERE-Klausel verwendet wird, werden die Zeilen automatisch zuerst nach der höchsten Relevanz sortiert. Um nach einer genauen Zeichenfolge zu suchen, schließen Sie sie in doppelte Anführungszeichen ein.

Volltextsuche mit dem Abfrageerweiterungsmodus

Volltextsuchen unterstützen auch den Abfrageerweiterungsmodus. Ein solcher Suchmodus wird häufig verwendet, wenn sich der Benutzer auf implizites Wissen verlässt – beispielsweise sucht der Benutzer nach „DBMS“, in der Hoffnung, in den Suchergebnissen sowohl „MongoDB“ als auch „MySQL“ zu sehen. Der Grund, warum sich der Benutzer bei der Verwendung eines solchen Suchmodus möglicherweise auf implizites Wissen verlassen kann, ist ziemlich einfach:Eine Volltextsuche mit dem Abfrageerweiterungsmodus funktioniert, indem die Suche zweimal ausgeführt wird:Der zweite Suchbegriff ist der erste Suchbegriff verkettet mit einigen der relevantesten Einträge aus der ersten Suche. Das heißt, wenn beispielsweise bei der ersten Suche eine der Zeilen das Wort „DBMS“ und das Wort „MySQL“ enthalten würde, würde die zweite Suche die Einträge finden, die das Wort „MySQL“ enthalten würden, auch wenn dies nicht der Fall ist enthalten „DBMS“. Das Abfrageformat, das den Abfrageerweiterungsmodus verwenden würde, würde folgendermaßen aussehen:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

Volltextsuche im booleschen Modus

Der boolesche Modus ist vielleicht eines der interessantesten Dinge, die die MySQL-Volltextsuche zu bieten hat. Dieser Modus weist viele einzigartige Einschränkungen auf, da Sie die Suchfunktionen mithilfe von booleschen Operatoren erweitern können. Wenn der boolesche Modus verwendet wird, können bestimmte Zeichen am Anfang oder Ende von Wörtern eine besondere Bedeutung haben. Zum Beispiel:

  • „+“ bedeutet UND;
  • „-“ bedeutet NICHT;
  • Die Operatoren „(“ und „)“ ermöglichen das Erstellen von Teilausdrücken;
  • Die Operatoren
  • „<“ und „>“ ändern den Rang des Suchwerts nach unten oder nach oben;
  • „~“ verringert den Beitrag des Werts zu den Suchergebnissen;
  • Doppelte Anführungszeichen ("") stimmen nur mit wörtlichen Werten überein;
  • “*” ist ein Wildcard-Operator (siehe Erklärung oben).

Mit diesen Operatoren können Sie die Funktionalität der Suche erweitern:Wenn Sie beispielsweise alle Zeilen abrufen möchten, die das Wort „Demo“, aber nicht „Demo2“ enthalten, können Sie eine Abfrage verwenden etwa so:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

Sie können auch doppelte Anführungszeichen zusammen mit einfachen Anführungszeichen wie folgt verwenden:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

Probleme bei der Volltextsuche

Bevor Sie die Volltextsuche in MySQL verwenden, denken Sie daran, dass die Suche einige „Fallstricke“ hat:

  • Sowohl die InnoDB- als auch die MyISAM-Speicher-Engine haben ihre eigenen Listen mit Stoppwörtern. Die InnoDB-Stoppwortliste finden Sie hier, die MyISAM-Stoppwortliste finden Sie hier.
    • Um Ihre eigene Stoppwortliste für InnoDB zu definieren, definieren Sie eine Tabelle mit derselben Struktur wie die Tabelle INNODB_FT_DEFAULT_STOPWORD, fügen dort Stoppwörter ein und setzen dann den Wert der Option innodb_ft_server_stopword_table in Form von db_name/table_name.
    • Um Ihre eigene Stoppwortliste für MyISAM zu definieren, setzen Sie die Variable ft_stopword_file auf den Pfadnamen der Datei, die die Stoppwortliste enthält. In der Datei können Stoppwörter durch beliebige nichtalphanumerische Zeichen außer „_“ und „‘“ getrennt werden. Die Standard-Stoppwortdatei befindet sich unter storage/myisam/ft_static.c. Stoppwörter können deaktiviert werden, indem die Variable auf einen leeren String gesetzt wird.
  • Volltextsuchen werden in partitionierten Tabellen nicht unterstützt.
  • Alle Spalten in einem FULLTEXT-Index müssen denselben Zeichensatz und dieselbe Sortierung verwenden.
  • Volltextsuchvorgänge behandeln die %-Zeichenfolge nicht als Platzhalter.

Hier ist ein weiterer Haken:Sie sollten vielleicht auch bedenken, dass der eingebaute FULLTEXT-Parser bestimmt, wo Wörter beginnen und enden, indem er bestimmte Zeichen betrachtet, einschließlich Leerzeichen („ “), Komma („, “) und Punkt („.“) bedeutet, dass die Suchergebnisse möglicherweise nicht korrekt sind, wenn Ihre Suchzeichenfolge eines oder mehrere dieser Zeichen enthält. Wenn Ihre Datenbank beispielsweise 5 Zeilen mit der Zeichenfolge „test.demo“ enthält, könnte die Suchanfrage „test.demo“ mehr (10, 15 usw.) Ergebnisse zurückgeben, einschließlich „demo“, „string.demo_example“ usw. weil Es wird nach „demo“ anstelle von „test.demo“ gesucht, sodass Sie möglicherweise mit vielen irrelevanten Übereinstimmungen festsitzen. MySQL bietet eine Problemumgehung für dieses Problem, wenn Sie bereit sind, Ihr eigenes Plugin in C oder C++ zu schreiben (siehe MySQL-Dokumentation), aber bis dahin können Sie nicht viel tun.

Die vollständige Liste der Volltextbeschränkungen von MySQL finden Sie auf der Dokumentationsseite von MySQL.

Zusammenfassung

Die MySQL-Volltextsuchfunktion bietet eine einfache Möglichkeit, verschiedene Suchtechniken (Suche in natürlicher Sprache, Abfrageerweiterungssuche und boolesche Suche) in Ihre Anwendung zu implementieren, auf der MySQL ausgeführt wird. Jede dieser Suchtechniken hat ihre eigenen Vorbehalte und jede von ihnen kann für unterschiedliche Zwecke geeignet sein - wenn Sie sich entscheiden, ob Sie die Volltextsuche verwenden möchten, denken Sie daran, dass diese Art der Suche viele Feinheiten hat, die für sie einzigartig sind, kennen Sie sowohl die Vorteile als auch die Nachteile der Verwendung der Volltextsuche in MySQL und wählen Sie mit Bedacht aus.