MySQLコマンドやSQL文に関する各種メモ書き

MySQL(Maria DB)で全文検索 (FULLTEXT INDEX) を使用する

● Mroongaのインストール

kusanagiの場合

kusanagi addon install mroonga

kusanagiを使ってない場合
こちらに詳しく載っています
http://asuki-yt.hatenablog.jp/entry/2018/04/03/200000

● (設定:1)MySQLの全文検索の「検索マッチ最小文字数」の設定を行う

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

● (設定:2)全文検索インデックスの作成

alter table MY-TABLE add fulltext(`COLUMN-NAME`);

● (設定:2)全文検索インデックスの確認

show index in MY-TABLE;

● (設定:3)現在のDB(のテーブル)のストレージエンジンを Mroonga に変更する

ストレージエンジンを変更しなくても一見日本語全文検索ができているように見えますが、 検索文字の前後に半角文字があるデータしかマッチしません。 ストレージエンジンを 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 );

● OR 検索

select * from TABLE-NAME where match(COLUMN-NAME) against( '電車 バス' IN BOOLEAN MODE );

● AND 検索

select * from TABLE-NAME where match(COLUMN-NAME) against( '+京都 +カフェ' IN BOOLEAN MODE );

● MariaDBの日本語全文検索は実際にどれくらい早いのか?

実データで検証しました

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)

● Mroongaの最適化

http://mroonga.org/ja/docs/reference/optimizations.html

関連エントリー

No.1299
10/26 20:06

edit

全文検索