MySQL5.1で日本語全文検索(その3;インストールできたの巻)

昨日のログで、MySQL5.1(FC13のRPMインストール)でFULLTEXTインデックスを張れないと書いたが、自分は諦めが悪い人。
そうしたら、このログ(Wiki)を発見。Fulltext parser pluginのプロダクトでmecabプラグインの導入に成功したとのこと。それなら、やってみよう、とやり直したら、結局、BigramもMecabプラグインも導入できた。

導入方法を覚え書きしておく。

まず、MeCabから導入しておく。
本家サイトから、以下をダウンロードする。

  • mecab-0.98.tar.gz
  • mecab-ipadic-2.7.0-20070801.tar.gz

これをともに適当なところに解凍、コンパイルする。(注;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 install

tar 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 install

tar 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を再起動する。

2.プラグインのインストール
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

オミナエシ は 女郎花 と 呼ば れ ます