8

そのため、MySQL データベースで全文ブール検索を実行して、用語「C++」を含むレコードを返す方法を見つける必要があります。

SQL検索文字列は次のとおりです。

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

すべてのフィールドに文字列 C++ が含まれていますが、検索結果には返されません。

これに対応するために MySQL を変更するにはどうすればよいですか? 出来ますか?

私が見つけた唯一の解決策は、データを「__plus」のようなものとして入力し、検索を変更して対応するプロセス中に + 文字をエスケープすることですが、これは面倒なようで、より良い方法が必要です。

4

4 に答える 4

8

これに対応するために MySQL を変更するにはどうすればよいですか?

単語が何であるかについての MySQL の考えを変更する必要があります。

まず、デフォルトの最小単語長は 4 です。これは、「C++」であろうと「cpp」であろうと、4 文字未満の単語のみを含む検索語は一致しないことを意味します。これは、 ft_min_word_len設定オプションを使用して設定できます。あなたのmy.cfgで:

[mysqld]
ft_min_word_len=3

(次に、MySQLd を停止/開始し、フルテキスト インデックスを再構築します。)

次に、「+」は MySQL では文字と見なされません。文字にすることもできますが、そうすると「fish+chips」という文字列で「fish」という単語を検索できなくなるため、注意が必要です。そして、それは些細なことではありません。MySQL を再コンパイルするか、既存の文字セットをハッキングする必要があります。ドキュメントのセクション 11.8.6の「単語の文字と見なされる文字セットを変更する場合...」で始まるセクションを参照してください。

データを「__plus」のようなものとして入力し、検索を変更して対応するプロセス中に + 文字をエスケープします

はい、そのようなものが一般的なソリューションです。「実際の」データを (エスケープせずに) プライマリの決定的なテーブルに保持できます。通常は、ACID 準拠のために InnoDB を使用します。次に、補助的な MyISAM テーブルを追加して、全文検索ベイト用のマングルされた単語のみを含めることができます。このアプローチを使用して、限られた形式のステミングを行うこともできます。

もう 1 つの可能性は、MySQL が実行できない検索 (短い単語のみ、または特殊な文字のみを含む検索など) を検出し、それらの検索に対してのみ単純だが遅い LIKE または REGEXP 検索にフォールバックすることです。この場合、ft_stopword_fileを空の文字列に設定してストップリストを削除することもできます。これは、その中のすべてを特別なものとしてピックアップすることは実際的ではないためです。

于 2009-02-25T07:38:18.323 に答える
1

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

二重引用符 ("") 文字で囲まれた語句は、その語句を入力したとおりに含む行のみに一致します。

これは、次のクエリを使用して「C++」を検索できることを意味します。

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE)
于 2009-08-14T08:03:02.697 に答える
0

通常、エスケープ文字はデータベース データではなくクエリで使用されます。クエリ内の各 "+" をエスケープしてみてください。

于 2009-02-25T06:51:04.100 に答える
0

解決::

my.ini ファイルを変更する

この2行を入れてください

ft_min_word_len = "1"
ft_stopword_file =""

[mysqld]

ファイルを保存してmysqlサーバーを再起動するよりも。

my.iniファイルは全員で共有されます。一部のセッションのみでファイルを変更できmy.iniますか?

于 2010-12-06T06:45:27.267 に答える