web-dev-qa-db-ja.com

MATCH()AGAINST()を使用した文字列と数値のMysql検索

MATCHAGAINST関数に問題があります。

次のクエリでも同じ結果が得られます。

SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')

フルテキストテーブルの列で文字列と数値の両方を検索するにはどうすればよいですか?

ありがとう

11
Gambric

順序が重要ではない場所でFiat500が必要な場合は、

SELECT * FROM models MATCH(name) AGAINST('+Fiat +500');

一緒にFiat 500が必要な場合は、

SELECT * FROM models MATCH(name) AGAINST('+"Fiat 500"');

Fiatと0個以上の500が必要な場合は、

SELECT * FROM models MATCH(name) AGAINST('+Fiat 500');

500と0個以上のFiatが必要な場合は、

SELECT * FROM models MATCH(name) AGAINST('Fiat +500');

試してみる !!!

更新2013-01-2818:28 EDT

フルテキスト検索のデフォルト設定は次のとおりです

mysql> show variables like 'ft%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_Word_len          | 84             |
| ft_min_Word_len          | 4              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |
+--------------------------+----------------+
5 rows in set (0.00 sec)

mysql>

ft_min_Word_len はデフォルトで4であることに注意してください。トークン500の長さは3です。したがって、インデックスはまったく作成されません。あなたは3つのことをしなければならないでしょう:

ステップ01:小さい文字列トークン用に構成する

これを/etc/my.cnfに追加します

[mysqld]
ft_min_Word_len = 1

ステップ02:mysqlを再起動します

service mysql restart

ステップ03:modelsテーブル内のすべてのインデックスのインデックスを再作成します

FULLTEXTインデックスをドロップして追加するだけです

または段階的に実行して、事前にどれだけ大きくなるかを確認します

CREATE TABLE models_new LIKE models;
ALTER TABLE models_new DROP INDEX name;
ALTER TABLE models_new ADD FULLTEXT name (name);
ALTER TABLE models_new DISABLE KEYS;
INSERT INTO models_new SELECT * FROM models;
ALTER TABLE models_new ENABLE KEYS;
ALTER TABLE models RENAME models_old;
ALTER TABLE models_new RENAME models;

これがうまくいったことに満足したら、実行します

DROP TABLE models_old;

試してみる !!!

32
RolandoMySQLDBA

他の人に役立つ場合に備えて、InnoDBを使用している場合は、mysql.cnfプロパティの別のセットを使用する必要があります

例えば

show variables like 'innodb_ft%';

my.cnfで、ft_min_Word_lenの代わりに次の値を設定します

innodb_ft_min_token_size=1
0
ashario