MATCH AGAINST 関数に問題があります。
次のクエリでも同じ結果が得られます。
SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')
FULL TEXT テーブルの列で文字列と数値の両方を検索するにはどうすればよいですか?
ありがとう
MATCH AGAINST 関数に問題があります。
次のクエリでも同じ結果が得られます。
SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')
FULL TEXT テーブルの列で文字列と数値の両方を検索するにはどうすればよいですか?
ありがとう
順序が問題にならない場所で必要な場合はFiat
、500
SELECT * FROM models MATCH(name) AGAINST('+Fiat +500');
Fiat 500
一緒に必要なら
SELECT * FROM models MATCH(name) AGAINST('+"Fiat 500"');
Fiat
ゼロ以上が必要な場合は500
、
SELECT * FROM models MATCH(name) AGAINST('+Fiat 500');
500
ゼロ以上が必要な場合はFiat
、
SELECT * FROM models MATCH(name) AGAINST('Fiat +500');
試してみる !!!
FULLTEXT 検索のデフォルト設定は次のとおりです。
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 つのことを行う必要があります。
これを追加/etc/my.cnf
[mysqld]
ft_min_word_len = 1
service mysql restart
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;
試してみる !!!