2

問題を少し洗練するつもり

説明列には、たくさんのテキストの中に USD$15、USD15 が含まれています。

ブールモードで全文検索を使用していますが、空の結果が返されました

select * from books WHERE MATCH (description) AGAINST ('USD$15' IN BOOLEAN MODE); 空集合 (0.00 秒)

しかし

select * from books WHERE MATCH (説明) AGAINST ('USD15' IN BOOLEAN MODE);

成功しています......

4

3 に答える 3

3

クエリと適切なテキストの間の関連性を生成するように設計されているため、価格の全文検索は使用しないでください。そのため、大量のテキストで特定のキーワードを検索できます。インデックスには単語のトークン化されたバージョンが含まれており、文字ごとの一致には使用できません。

代わりに DECIMAL(15,4) のようなものを使用し、通貨設定を別のフィールド (ENUM/TINYINT) に移動します

最悪の場合 (テーブル構造と挿入されたデータに影響を与えることはできません) - BTREE インデックスで通常の CHAR/VARCHAR を使用し、WHERE price LIKE ... アプローチで検索できます。

于 2013-09-06T15:01:04.490 に答える
1

これはあなたの問題かもしれません。$

一部の単語は全文検索で無視されます: 短すぎる単語はすべて無視されます。全文検索で検出される単語の既定の最小長は 4 文字です。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

この設定はここで変更できますが、索引付けされる他のすべての 3 文字の単語の結果を考慮してください:my.cnfこの設定では:ft_min_word_len = 3

また、@webdevbyjoss は実際の懸念事項を明確にしています。これは、価格を一致させるだけの場合は、全文検索以外で処理する方が適切です。

更新 あなたは正しい$です。有効な/含まれる文字として追加する必要もあります。そうしないと、無視されます。ドキュメントから:

単語の文字と見なされる文字のセットを変更する場合は、次のリストで説明するように、いくつかの方法で変更できます。変更を行った後、FULLTEXT インデックスを含む各テーブルのインデックスを再構築する必要があります。ハイフン文字 ('-') を単語文字として扱いたいとします。次のいずれかの方法を使用します。

  1. MySQL ソースを変更します。myisam/ftdefs.h で、true_word_char() および misc_word_char() マクロを参照してください。これらのマクロの 1 つに「-」を追加して、MySQL を再コンパイルします。
  2. 文字セット ファイルの変更: 再コンパイルは必要ありません。true_word_char() マクロは、「文字タイプ」テーブルを使用して、文字と数字を他の文字と区別します。. いずれかの文字セット XML ファイルの配列の内容を編集して、「-」が「文字」であることを指定できます。次に、指定された文字セットを FULLTEXT インデックスに使用します。配列形式については、セクション10.3.1「文字定義配列」を参照してください。
  3. インデックス付き列で使用される文字セットの新しい照合を追加し、その照合を使用するように列を変更します。照合の追加に関する一般的な情報については、セクション10.4「文字セットへの照合の追加」を参照してください。全文索引付けに固有の例については、セクション12.9.7「全文索引付けのための照合の追加」を参照してください。
于 2013-09-06T15:05:21.200 に答える
0

デフォルトは4ですが、3文字の文字列と照合しようとしています(あなたの場合もそうだと思います)。

MySQLドキュメントのこのページには次のように書かれています:

Any word that is too short is ignored. The default minimum length of words that are found by full-text searches is four characters.

全文検索を微調整するには、これを確認してください。

For example, if you want three-character words to be searchable, 
you can set the ft_min_word_len variable by putting the following 
lines in an option file:

[mysqld]
ft_min_word_len=3

アップデート:

MySQL のドキュメントから:

A phrase that is enclosed within double quote (“"”) 
characters matches only rows that contain the 
phrase literally, as it was typed. 
The full-text engine splits the phrase into words 
and performs a search in the FULLTEXT index for the words. 
Nonword characters need not be matched exactly: 
Phrase searching requires only that matches contain exactly 
the same words as the phrase and in the same order. 
For example, "test phrase" matches "test, phrase".

つまり、基本的には、検索フレーズを二重引用符で囲んだ全文検索を試すことができ、ドル記号が列値の USD と価格の間の唯一の特殊文字である限り (また、それらの間にスペースがない限り)、必要な結果を得ることができることを意味します。ただし、単語検索はFULLTEXT検索で、特殊文字は無視されるので、これに頼るのは非常に危険です。

データベースの変更が問題にならない場合は、全文検索に SPHINX を検討できます。

于 2013-09-06T15:06:08.313 に答える