MySQL5.1にMeCabのfull-text parser pluginを入れてみた

MySQL5.0で全文検索というと、Tritonn入れたりしてSennaを使うのが常套手段。そういうところはプラグインで解決するのが5.1のやり方らしい。

というわけで、MySQL5.1でfull-text indexを作成出来るようになる、mysqlftppcことMySQL full-text parser plugin collectionを入れてみました。環境はCentOS5.4(x86_64)。

MySQL本体は公式のRPMを使用。

MeCabはこのあたりを参考にして、あらかじめセットアップ済み。

ICU(International Components for Unicode)を入れておくと、Unicodeの正規化も対応できるらしい。とりあえず入れてみた。

sudo yum install icu libicu-devel.x86_64

libicu-develを入れておかないと、icu-configが無くてmysqlftppc mecab pluginがICUを使ってくれないので注意。

からファイルを落としてきて、./configure && make && sudo make installですんなり入った。あとは、mysql -u rootから

mysql> install plugin mecab soname 'libftmecab.so';
Query OK, 0 rows affected (0.04 sec)

mysql> show plugins;
+------------+----------+----------------+---------------+---------+
| Name       | Status   | Type           | Library       | License |
+------------+----------+----------------+---------------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| FEDERATED  | DISABLED | STORAGE ENGINE | NULL          | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL          | GPL     |
| mecab      | ACTIVE   | FTPARSER       | libftmecab.so | BSD     |
+------------+----------+----------------+---------------+---------+
11 rows in set (0.00 sec)

mysql> show status like 'Mecab_info';
+---------------+---------------------------------------+
| Variable_name | Value                                 |
+---------------+---------------------------------------+
| Mecab_info    | with mecab 0.98, ICU 3.6(Unicode 5.0) |
+---------------+---------------------------------------+
1 row in set (0.00 sec)

プラグインのインストールは無事に出来たようなので、my.cnfの[mysqld]に

# mysqlftppc
mecab_normalization = KC
mecab_unicode_version = 3.2
mecab_dicdir = /opt/mecab/lib/mecab/dic/naist-jdic

のように設定を追加してrestart。公式のサンプルを実行してみたら、

mysql> CREATE TABLE me (c TEXT, FULLTEXT(c) WITH PARSER mecab);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table me\G
*************************** 1. row ***************************
       Table: me
Create Table: CREATE TABLE `me` (
  `c` text,
  FULLTEXT KEY `c` (`c`) /*!50100 WITH PARSER `mecab` */ 
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> INSERT INTO me VALUES("今日の天気は晴れです。");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM me WHERE MATCH(c) AGAINST('+"今日の天気"' IN BOOLEAN MODE);
+-----------------------------------+
| c                                 |
+-----------------------------------+
| 今日の天気は晴れです。            |
+-----------------------------------+
1 row in set (0.01 sec)

mysql> explain SELECT * FROM me WHERE MATCH(c) AGAINST('+"今日の天気"' IN BOOLEAN MODE);
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type     | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | me    | fulltext | c             | c    | 0       |      |    1 | Using where |
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

となった。これでセットアップは完了かな。

Sennaと同じくMyISAMでしか動かないんだけど、SlideShareの資料には解決できていない問題として「MyISAMしかまだ対応してない」とあるので、対応ストレージエンジンは増えていくのかも。