MySQL5.1で日本語全文検索(その3;インストールできたの巻)
昨日のログで、MySQL5.1(FC13のRPMインストール)でFULLTEXTインデックスを張れないと書いたが、自分は諦めが悪い人。
そうしたら、このログ(Wiki)を発見。Fulltext parser pluginのプロダクトでmecabプラグインの導入に成功したとのこと。それなら、やってみよう、とやり直したら、結局、BigramもMecabプラグインも導入できた。
導入方法を覚え書きしておく。
まず、MeCabから導入しておく。
本家サイトから、以下をダウンロードする。
これをともに適当なところに解凍、コンパイルする。(注;mecabのコンパイルには c++が必要なので、ない場合には、yum install gcc-c++でインストール)
tar zxfv mecab-0.98.tar.gz
cd mecab-0.98
./configure --prefix=/usr --with-charset=utf8
make
make installtar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --prefix=/usr --with-charset=utf8
make
make install
でよい。
次にICUをインストールする。
本家サイトからtarをダウンロードする。
- icu4c-4_4_1-src.tgz
そして、解凍とコンパイル。makeは少し時間がかかる。
tar zxfv icu4c-4_4_1-src.tgz
cd icu
./configure --prefix=/usr
make
make install
これで Fulltext parser puginを導入する下準備が整った。
1. アーカイブの取得とコンパイル、my.cnfの修正
本家サイトからダウンロードする。
- mysqlftppc-bigram-1.6.tar.gz
- mysqlftppc-mecab-1.6.tar.gz
tar zxfv mysqlftppc-bigram-1.6.tar.gz
cd mysqlftppc-bigram-1.6
./configure --prefix=/usr
make
make installtar zxfv mysqlftppc-mecab-1.6.tar.gz
cd mysqlftppc-mecab-1.6
./configure --prefix=/usr
make
make install
これで、/usr/lib/mysql/pluginに以下の soがインストールされる(気が利いてます)。
- libftbigram.so
- libftmecab.so
次に/etc/my.cnfの[mysqld]のセクションを修正して、以下の2行を追加(注;spaceは” “ではなくて、リテラルで”space”と書く=>とはいえ、この部分はスペースプラグイン用の定義なので、いらないんじゃないかと思われる。あっても怒られない)。
[mysqld]
ft_min_word_len=1
plugin-load=space=libftspace.so:mecab=libftmecab.so:bigram=libftbigram.so
1行目は、MySQLのFULLTEXTインデックスが4文字以下の単語はインデックスしない、という変なルールを持っているため(詳細は、MySQLの公式マニュアルを参照)、「1文字から対象にするよ」という宣言になる。
そうしたら、
service mysqld restart
でMySQLを再起動する。
mysql> install plugin bigram soname 'libftbigram.so'; mysql> install plugin mecab soname 'libftmecab.so';
と2つのパーサーをインストールする。
Bigramについては、
mysql> SHOW STATUS LIKE "Bigram_info"; +---------------+-----------------------------+ | Variable_name | Value | +---------------+-----------------------------+ | Bigram_info | with ICU 4.4.1(Unicode 5.2) | +---------------+-----------------------------+ 1 row in set (0.01 sec)
で確認。
MeCabについては、
mysql> SHOW STATUS LIKE "Mecab_info"; +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | Mecab_info | with mecab 0.98, ICU 4.4.1(Unicode 5.2) | +---------------+-----------------------------------------+ 1 row in set (0.00 sec)
で確認。
3.テーブルの作成
BigramとMeCabのテスト用に以下の2つテーブルを作成する。Bigramはテーブル名;bi、MeCabはテーブル名;me。FULLTEXTインデックスを張るためだけのカラム(カラム名;c)を持たせる。
mysql> CREATE TABLE bi (c TEXT, FULLTEXT(c) WITH PARSER bigram) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; mysql> CREATE TABLE me (c TEXT, FULLTEXT(c) WITH PARSER mecab) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
COLLATEは、Fulltext parser pluginの本家サイトにかかれているように、全角半角などの「日本語の曖昧さ」を吸収するために、utf8_unicode_ciに設定する。
これで準備はOK。
Wikipedia から、クリスマスローズ、オミナエシ、オシロイバナについてのテキストをもってきて、このテーブルにインサートして実験した(花の名前なのは、自分が「植物愛好家」のため)。FULLTEXTインデックスを張る場合、BOOLEAN MODEでMATCHする場合以外は、「50%ルール」というのがあって、「レコードの50%に出現する文字列は、検索対象としない」、なので、3つ以上でテストしてね、と書いてある。検索の「ノイズ除去」のためと思うが(この目的のために、 stop wordも定義できるようだ)、紛らわしい。このあたりもMySQLの公式サイトを参照。
MySQLで作業するときは、
set names utf8;
を1回実行して、作業文字コードを明示しておく。(これを結構、忘れちゃう)。
4.確認
とりあえず、分かち書きができてるか確認する。
mysql> SELECT count(*) from bi where MATCH(c) AGAINST('+"オミ"' IN BOOLEAN MODE); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from me where match(c) against('+"オミナエシ"' IN BOOLEAN MODE); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.01 sec)
となるので、「オミナエシ」がちゃんと認識できている。ちなみに、オミナエシ(女郎花)をMeCabそのものにかけてみると、以下のようになる。
echo "オミナエシは女郎花と呼ばれます" | mecab -Owakati
オミナエシ は 女郎花 と 呼ば れ ます