最小マッチ文字を2文字にセットする
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
ALTER TABLE `テーブル名` ADD FULLTEXT(`カラム名`);
通常の検索 LIKE検索(遅い)
SELECT item_name AS `numrows`
FROM `item_dt`
WHERE
`item_name` LIKE '%SSD256GB%';
全文検索(速い)
SELECT item_name AS `numrows`
FROM `item_dt`
WHERE
MATCH(`item_name`) AGAINST( "+SSD256GB" IN BOOLEAN MODE);
インデックスを削除 → インデックスを再度作成 を行ないます。
show index from 【テーブル名】;
DROP INDEX 【インデックス名】 ON 【テーブル名】;
ALTER TABLE `テーブル名` ADD FULLTEXT(`カラム名`);
kusanagiの場合
kusanagi addon install mroonga
kusanagiを使ってない場合
こちらに詳しく載っています
http://asuki-yt.hatenablog.jp/entry/2018/04/03/200000
https://dev.mysql.com/doc/refman/5.6/ja/fulltext-fine-tuning.html
単語の最小長と最大長の構成 インデックスが付けられる単語の最小長および最大長は、InnoDB 検索インデックスの場合は innodb_ft_min_token_size および innodb_ft_max_token_size、MyISAM 検索インデックスの場合は ft_min_word_len および ft_max_word_len で定義されます。これらのオプションのいずれかを変更したら、変更を有効にするために FULLTEXT インデックスを再構築してください。たとえば、2 文字の単語を検索可能にするには、オプションファイルに次の行を配置します。
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
設定ファイル my.cnf を編集する
vi my.cnf
[mysqld]
# innoDBの全文検索 最小文字数
innodb_ft_min_token_size=1
# MyISAMの全文検索 最小文字数
ft_min_word_len=1
mysqlのリスタート
systemctl restart mysql
設定の確認
show variables like '%ft%';
alter table MY-TABLE add fulltext(`COLUMN-NAME`);
show index in MY-TABLE;
ストレージエンジンを変更しなくても一見日本語全文検索ができているように見えますが、 検索文字の前後に半角文字があるデータしかマッチしません。 ストレージエンジンを Mroonga に変更する事で前後に全角文字があるデータもマッチするようになります。
現在のDB(のテーブル)のストレージエンジンを確認する
use information_schema;
select table_schema, table_name, engine from TABLES WHERE table_schema = 'MY-DB';
ストレージエンジンを Mroonga に変更する
use MY-DB
ALTER TABLE `MY-TABLE` ENGINE = Mroonga;
https://dev.mysql.com/doc/refman/5.6/ja/fulltext-search.html
実行モードには下記の4つありますが
IN NATURAL LANGUAGE MODE
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
IN BOOLEAN MODE
WITH QUERY EXPANSION
これを一番よく使います。
select * from TABLE-NAME where match(COLUMN-NAME) against( '+検索文字' IN BOOLEAN MODE );
select * from TABLE-NAME where match(COLUMN-NAME) against( '電車 バス' IN BOOLEAN MODE );
select * from TABLE-NAME where match(COLUMN-NAME) against( '+京都 +カフェ' IN BOOLEAN MODE );
実データで検証しました
select count(*) from MY-TABLE
+----------+
| count(*) |
+----------+
| 3431394 |
+----------+
340万データを持つテーブルを検索してみます。
・日本語全文検索
select count(*) from MY-TABLE where match(item_name) against( '+キーワード' IN BOOLEAN MODE );
+----------+
| count(*) |
+----------+
| 1451 |
+----------+
1 row in set (0.05 sec)
・LIKE検索
select count(*) from MY-TABLE where item_name like '%キーワード%';
+----------+
| count(*) |
+----------+
| 1451 |
+----------+
1 row in set (26.32 sec)
MySQL5.7以降ではデフォルトで InnoDBで日本語全文検索が使えるようになりました。
SELECT version();
ALTER TABLE mytable ADD FULLTEXT KEY (title, content) WITH PARSER ngram;
対象テーブル「item_table」対象カラム「item_name」
インデックス名「item_name_fulltext_idx」
でフルテキストインデックスを作成する
CREATE FULLTEXT INDEX `item_name_fulltext_idx` ON `item_table` (`item_name`) WITH PARSER ngram;
デフォルトは4文字以上の単語が対象ですがその対象を2文字に変更することができます。
/etc/my.cnf
[mysqld]
innodb_ft_min_token_size=2
一度削除してから再度作成すればOKです。
DROP INDEX item_name_fulltext_idx ON item_table ;
CREATE FULLTEXT INDEX `item_name_fulltext_idx` ON `item_table` (`item_name`) WITH PARSER ngram ;