11

MATCH AGAINST 関数に問題があります。

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

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

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

ありがとう

4

2 に答える 2

37

順序が問題にならない場所で必要な場合はFiat500

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');

試してみる !!!

更新 2013-01-28 18:28 EDT

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 つのことを行う必要があります。

STEP 01 : より小さな文字列トークンを構成する

これを追加/etc/my.cnf

[mysqld]
ft_min_word_len = 1

STEP 02 : mysql を再起動する

service mysql restart

STEP 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;

試してみる !!!

于 2013-01-28T22:28:08.660 に答える