MySQL InnoDB FullText Indexによる全文検索の実装メモ

スポンサーリンク
サーバ技術
スポンサーリンク
↑管理人が個人でUnity+Live2Dで作成しているスマホゲームです

前回MySQLを5.7にバージョンアップしたので、MySQL上のInnoDBテーブルにFull-Text Indexを用いた全文検索を行えるようにしてみた自分用メモです。さくらのVPSを使っているので同環境の方は参考になれば幸いです。
これまでデフォルトで全文検索機能を利用できたデータベースエンジンはMyISAMだけだったのですが、5.6以降からはInnoDBも利用できるようになっています。さらに5.7.6からは日本語用パーサの導入も簡単になっています(と思います)。
作業の流れとしては、MeCabパーサと辞書をインストール、MeCabの設定ファイルmecabrcを編集、MySQLのmy.cnfを編集、MySQLを再起動してコンソールからMeCab全文検索プラグインをインストール、既存テーブルにFull-Text Indexを作成、既存ModelクラスのSELECT文を編集となります。

MeCabパーサと辞書をインストール

http://taku910.github.io/mecab/#download
mecab-***.tar.gzとmecab-ipadic-***.tar.gz をDLし、適当なディレクトリで展開します。様々な環境で解説しているサイトがありますが、環境によってmysqlに関するディレクトリ構成が異なるようです。私は/var/lib/mysql-files/に展開しました。
パーサのインストール

 # tar zxfv mecab-0.996.tar.gz
 # cd mecab-0.996
 # ./configure
 # make
 # make check
 # make install

辞書のインストール

# tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
# mecab-ipadic-2.7.0-XXXX
# ./configure --with-charset=utf8
# make
# make install

mecabrcファイルを編集します。今回の場合は /var/lib/mysql-files/mecab-0.996/mecabrcに存在します(追記:/usr/local/etc/mecabrc のケースもありました)。
dicdir行を「dicdir = /usr/local/lib/mecab/dic/ipadic_utf-8」と変更するように解説するサイトもありますが、少なくとも私がインストールした辞書ファイルには/dic/下のipadicファイル1つしかありませんでした。
バージョンによっては文字コード別にファイルが分かれているのかもしれません。
私の場合は「dicdir = /usr/local/lib/mecab/dic/ipadic」とデフォルトのままでパスは問題ありませんでした。

MySQL側の変更

my.cnfを編集し、mecabrcファイルを指定します。

[mysqld]
loose-mecab-rc-file= /var/lib/mysql-files/mecab-0.996/mecabrc
innodb_ft_min_token_size=1

MySQLのコンソールで以下を入力してプラグインをインストールします。

install plugin mecab SONAME 'libpluginmecab.so';

次に全文検索に使用したいカラムを指定して、innoDBテーブルにFull-Text Indexを追加します。

alter table article add fulltext key (title, description) with parser MeCab;

データ行数によってはここでしばらく時間がかかります。

SELECT文の変更

SELECT * FROM article WHERE concat(title,description) like :keyword;

というようにLIKE検索であった所を、

SELECT * FROM article WHERE MATCH(title,description) AGAINST(:keyword in boolean mode)

というように変更します。検索精度がそのままでは下がるので、検索文字列と完全一致する文字列を検索したい場合は”+”を検索文字列の先頭に繋げてからSQLのプレースホルダに渡しましょう。
ちなみに個人的にハマった事がひとつ。全文検索導入するまではシステムにLIKEを使ってテーブルをJOINしていた処理があったのですが、MATCH AGAINSTではJOIN ONの条件に使えない事を知らない私は何故動かないのか無駄に時間を費してしまいました。。

注意

少なくとも現バージョンの辞書ファイルは./configure –with-charset=utf8とオプションを指定しないとujis(EUC-JP)でインストールされてしまいます。
もしujisでインストールしてしまった状態でUTF-8のテーブルに対してFull-Text Indexを作成した場合はSELECT文を投げるとエラーが出ます(出ました)。その場合はまずFull-Text Indexを削除してから

# cd mecab-ipadic-2.7.0-20070801
# make clean
# ./configure --with-charset=utf8
# make
# make install

として、MySQLを再起動し、再度Full-Text Indexを作成します。

※私の環境では「libmecab.so」ファイルは「/usr/local/lib/」にありました。

1 Star2 Stars3 Stars4 Stars5 Stars (まだ投票されていません)
読み込み中...

コメント

広告ブロッカーを無効にしてください。

タイトルとURLをコピーしました