2009-02-25 4 views
8

Also muss ich herausfinden, wie man eine boolesche Volltext-Suche in einer MySQL-Datenbank durchführt, um einen Datensatz zurückzugeben, der den Begriff "C++" enthält.Wie erhalten Sie Ihre boolesche Volltext-Suche, um den Begriff C++ zu erhalten?

Ich habe meine SQL Suchkette:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

Obwohl alle meine Felder die Zeichenfolge C++ enthalten, wird es nie in den Suchergebnissen zurückgegeben.

Wie kann ich MySQL ändern, um dies zu berücksichtigen? Ist es möglich? Die einzige Lösung, die ich gefunden habe, wäre, das + -Zeichen während der Eingabe meiner Daten als etwas wie "__plus" zu entgehen und dann meine Suche zu modifizieren, aber das scheint umständlich und es muss einen besseren Weg geben .

+0

Was zum Teufel ist eine Volltext-Boolesche Suche? Es klingt furchtbar, als hättest du dieses Wort erfunden. Auch deine Frage ist sehr vage. Sie müssen Ihr Problem besser beschreiben, was Sie vorhaben. Sonst können wir dir nicht helfen. –

+0

@John: Du bist sehr hart. Ich musste mich selbst davon abhalten, mich mit lmgtfy zu verlinken, deshalb gibt es hier eine Erklärung von MySQL: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html –

+0

@A. Rex - ich bin böse (in gewissem Sinne) mein Punkt, den ich als harsch empfinde, aber es fehlt die Frage, wie du eine gute Frage stellen würdest. Als solche können wir (Stack Overflow People) aufgrund ungenügender Informationen keine gute Antwort liefern. –

Antwort

8

Wie kann ich MySQL ändern, um dies zu berücksichtigen?

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

Erstens ist die Standardminimalwortlänge 4. Dies bedeutet, dass kein Suchbegriff, der nur Wörter von < 4 Buchstaben enthält, jemals übereinstimmen wird, ob das "C++" oder "cpp" ist. Sie können dies mit der Konfigurationsoption ft_min_word_len konfigurieren, z. in Ihrem my.cfg:

[mysqld] 
ft_min_word_len=3 

(Dann MYSQLD Stopp/Start und Volltext-Indizes neu erstellen.)

Zweitens ‚+‘ keinen Brief von MySQL betrachtet. Sie können es zu einem Buchstaben machen, aber das bedeutet, dass Sie nicht in der Zeichenfolge "Fisch + Chips" nach dem Wort "Fisch" suchen können, daher ist etwas Vorsicht geboten. Und es ist nicht trivial: Es erfordert das Neukompilieren von MySQL oder das Hacken eines vorhandenen Zeichensatzes. Siehe den Abschnitt, der mit "Wenn Sie die Zeichengruppe, die als Wortzeichen gelten ..." geändert werden soll, in section 11.8.6 des Dokuments.

entkommen das Zeichen + während des Prozesses meine Daten als so etwas wie „__plus“ einzugeben und dann meine Suche modifizieren zu empfangen

Ja, so etwas wie, dass eine gemeinsame Lösung ist: Sie können halten Sie Ihre "echte" Daten (ohne das Entkommen) in einer primären, endgültigen Tabelle - normalerweise unter Verwendung von InnoDB für ACID-Konformität. Dann kann eine zusätzliche MyISAM-Tabelle hinzugefügt werden, die nur die verfälschten Wörter für den Volltext-Such-Köder enthält. Sie können mit diesem Ansatz auch eine begrenzte Form des Stemmings durchführen. Eine andere Möglichkeit besteht darin, Suchvorgänge zu erkennen, die MySQL nicht ausführen kann, z. B. solche mit nur kurzen Wörtern oder ungewöhnlichen Zeichen, und auf eine einfache, aber langsame LIKE- oder REGEXP-Suche nur für diese Suchvorgänge zurückgreifen. In diesem Fall werden Sie wahrscheinlich auch die Stoppliste entfernen wollen, indem Sie ft_stopword_file auf eine leere Zeichenkette setzen, da es nicht praktisch ist, alles darin auch als speziell aufzunehmen.

+0

@bobince: (Re die Diskussion in den Kommentaren oben, danke für die Beantwortung dieser leicht verständlichen Frage in einer klaren Art.) Aus Neugier, wie würdest du mit diesem Ansatz stemming? Ersetzen Sie jedes Wort in der Hilfstabelle durch seinen Stamm? –

+0

Im Prinzip ja (die Wörter in Suchanfragen natürlich genauso verarbeiten). Normalerweise verwenden Sie eine vorhandene Suffix-Stripping-Stemmer-Bibliothek für Ihre bevorzugten Sprachen. (Für beide Werte von 'Sprache'; siehe zB Porters Algorithmus für Englisch in vielen Programmiersprachen.) – bobince

0

In der Regel werden maskierte Zeichen in der Abfrage nicht in den Datenbankdaten verwendet. Versuchen Sie, jedes "+" in Ihrer Abfrage zu umgehen.

1

Von http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html:

Ein Satz, der in doppelten Anführungszeichen („"“) Zeichen entspricht nur die Zeilen, die den Ausdruck wörtlich enthalten, wie es geschrieben wurde

Das heißt, Sie eingeschlossen ist. suchen kann 'C++' mit dieser Abfrage:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE) 
0

Lösung ::

Änderung my.ini

setzen diese beiden Linien

ft_min_word_len = "1" 
ft_stopword_file ="" 

unter

[mysqld] 

als savve Datei und starten Sie MySQL-Server.

my.ini Datei wird von allen erstellt. also können wir Änderungen in my.ini Datei für einige Sitzung nur tun.?

Verwandte Themen