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

Wie bringen Sie Ihre boolesche Volltextsuche dazu, den Begriff C++ aufzugreifen?

Sie müssen die Vorstellung von MySQL, was ein Wort ist, ändern.

Erstens beträgt die standardmäßige Mindestwortlänge 4. Das bedeutet, dass kein Suchbegriff, der nur Wörter mit <4 Buchstaben enthält, jemals zutrifft, egal ob „C++“ oder „cpp“. Sie können dies mit ft_min_word_len Konfigurationsoption, z. in deiner my.cfg:

[mysqld]
ft_min_word_len=3

(Dann MySQLd stoppen/starten und Volltextindizes neu aufbauen.)

Zweitens wird „+“ von MySQL nicht als Buchstabe betrachtet. Sie können es zu einem Buchstaben machen, aber das bedeutet dann, dass Sie nicht nach dem Wort „Fisch“ in der Zeichenfolge „Fisch+Chips“ suchen können, also ist etwas Sorgfalt erforderlich. Und es ist nicht trivial:Es erfordert die Neukompilierung von MySQL oder das Hacken eines bestehenden Zeichensatzes. Siehe den Abschnitt, der mit „Wenn Sie den Zeichensatz ändern möchten, der als Wortzeichen betrachtet wird...“ in Abschnitt 11.8.6 des Dokuments.

Ja, so etwas ist eine gängige Lösung:Sie können Ihre „echten“ Daten (ohne Escapezeichen) in einer primären, endgültigen Tabelle aufbewahren  – normalerweise verwenden Sie InnoDB für ACID-Compliance. Dann kann eine MyISAM-Hilfstabelle hinzugefügt werden, die nur die entstellten Wörter für Volltextsuchköder enthält. Mit diesem Ansatz können Sie auch eine begrenzte Form des Stemmings durchführen.

Eine andere Möglichkeit besteht darin, Suchen zu erkennen, die MySQL nicht ausführen kann, beispielsweise solche mit nur kurzen Wörtern oder ungewöhnlichen Zeichen, und nur für diese Suchen auf eine einfache, aber langsame LIKE- oder REGEXP-Suche zurückzugreifen. In diesem Fall möchten Sie wahrscheinlich auch die Stoppliste entfernen, indem Sie ft_stopword_file zu einer leeren Zeichenfolge, da es nicht praktikabel ist, auch darin alles als besonders aufzuheben.