web-dev-qa-db-ja.com

3文字より短い文字列でのMySQL全文検索で行が返されない

MySQLテーブルにいくつかのアドレスが含まれています。次の2行があるとします。

"10 Fake Street"
"101 Fake Street"

MATCH()AGAINST()で全文検索を使用しようとしています。 ft_min_Word_lenを1に設定し、サーバーを再起動して削除し、実行してインデックスを再構築しました

ALTER TABLE addresses DROP INDEX address_index
CREATE FULLTEXT INDEX address_index ON addresses(street)

私のft_min_Word_lenが実際に1に設定されていることを確認しました

show global variables like 'ft_min_Word_len'

検索に3文字未満の単語を含めた場合、ワイルドスターを追加しない限り、結果は返されません。例えば

SELECT * FROM addresses WHERE MATCH(street) AGAINST('+101' IN BOOLEAN MODE)

または

SELECT * FROM addresses WHERE MATCH(street) AGAINST('+10*' IN BOOLEAN MODE)

どちらも「101 Fake Street」という1行を返します。ランニング

SELECT * FROM addresses WHERE MATCH(street) AGAINST('+10' IN BOOLEAN MODE)

0行を返します。どうして?オンラインで見つけることができる唯一の提案はすべて、最小長の設定に関するものですが、私のものは1に設定されていることをすでに確認し、インデックスを再構築しました。

5
Egor

ft_min_Word_len の設定はMyISAMにのみ影響します。

デフォルトは3なので、 innodb_ft_min_token_sizeを1 に設定する必要があります。

innodb_ft_min_token_sizeを1 に設定したら、戻って実行します

ALTER TABLE addresses DROP INDEX address_index
CREATE FULLTEXT INDEX address_index ON addresses(street);

試してみる !!!

8
RolandoMySQLDBA