mysql5.1にテキスト解析プラグインとしてMeCabを組み込んでみる

mysql5.1のプラグイン機構の続き。
26.2. The MySQL Plugin Interfaceを参考にして、 mysql5.1(beta)のテキスト解析のプラグインサンプルを利用し、MeCab(解析エンジン)を組み込んでみる。
(OSはCentOS4.3)

mysql5.1のインストール

MySQL 5.1 Downloadsから必要なファイルをダウンロード。
Linux x86 generic RPM (dynamically linked) downloads」 の「Server」、「Client programs」、「Libraries and header files」から以下をダウンロード。
MySQL-server-5.1.14-0.glibc23.i386.rpm
MySQL-client-5.1.14-0.glibc23.i386.rpm
MySQL-devel-5.1.14-0.glibc23.i386.rpm
rpmコマンドを利用してインストール。

MeCabをインストール

以下を参考にMeCabUTF-8でインストール。
MeCab
CentOSにMeCab+Senna+MySQLを入れる
(ってか、MeCab+MySQL使いたいなら、素直にSenna入れたほうがいいのかも)

サンプルソースを修正してプラグインを作成

「Source downloads」の「Tarball (in 5.1 both Unix & Windows, tar.gz)」から以下をダウンロード。
mysql-5.1.14-beta.tar.gz
/plugin に以下の /daemon_example, /fulltext(テキスト解析プラグイン) の 2サンプルがある。
/daemon_example/README

This is an example of a daemon plugin. These are generic plugins that only hook ino the startup and shutdown of the database.

今回は /fulltext のサンプルを利用。
/fulltext/plugin_example.c を修正する。
まず、inlcude を追加する。
[c num=1]#include <mecab.h>[/c] そして、関数 simple_parser_parseをmecabを使うように修正する。
mecabインスタンスをプールするようにも出来ると思うのだけどもとりあえず。
[c num=1]static int simple_parser_parse(MYSQL_FTPARSER_PARAM *param) { number_of_calls++;

mecab_t mecab; mecab_node_t node;

mecab = mecab_new(0, 0); node = mecab_sparse_tonode2(mecab, param->doc, param->length); for(; node; node = node->next) { if (node->stat == MECAB_BOS_NODE || node->stat == MECAB_EOS_NODE) { continue; } add_word(param, node->surface, node->length); } mecab_destroy(mecab); / char end, start, docend= param->doc + param->length; for (end= start= param->doc;; end++) { if (end == docend) { if (end > start) add_word(param, start, end - start); break; } else if (isspace(end)) { if (end > start) add_word(param, start, end - start); start= end + 1; } } / return(0); }[/c] 修正したplugin_example.cをコンパイルする。
(autoconfだとなぜかうまくいかなかった。)

# gcc -Wall -DMYSQL_DYNAMIC_PLUGIN -shared -fPIC `mecab-config --cflags` `mecab-config --libs` -o plugin_example.so plugin_example.c

mecab-config --cflags mecab-config --libs」はMeCabを使う為のオプション、「-DMYSQL_DYNAMIC_PLUGIN」はmysqlプラグインに必要なオプション。

プラグインを組み込む

デフォルトのプラグインディレクトリは以下のようになっている。

mysql> show variables like 'plugin_dir';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| plugin_dir    | /usr/lib/mysql |
+---------------+----------------+

この「/usr/lib/mysql」に 「plugin_example.so」を配置する。
なお、/etc/my.cnf にても設定可能。

[mysqld]
plugin_dir=/path/to/plugin/directory

この「plugin_example.so」を組み込むには以下のコマンドを実行。

mysql> install plugin simple_parser soname 'plugin_example.so';

組み込めたかどうかは「show plugin」で確認できる。

mysql> show plugin;
+---------------+--------+----------------+-------------------+---------+
| 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     | ACTIVE | 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     |
| ndbcluster    | ACTIVE | STORAGE ENGINE | NULL              | GPL     |
| simple_parser | ACTIVE | FTPARSER       | plugin_example.so | GPL     |
+---------------+--------+----------------+-------------------+---------+
12 rows in set, 1 warning (0.00 sec)

「simple_parser」というプラグインが追加されているはず。
なお、このプラグインを利用するテーブルはこんな感じ。

CREATE TABLE t
(
  id integer auto_increment,
  c text,
  FULLTEXT INDEX (c) WITH PARSER simple_parser,
  primary key(id)
);

試し。

mysql> insert into t set c = '山田さんが太郎くんに本を貸しました。';
mysql> select match(c) against('太郎' in boolean mode ) from t;
+---------------------------------------------+
| match(c) against('太郎' in boolean mode ) |
+---------------------------------------------+
|                                           1 |
+---------------------------------------------+

「太郎」がマッチしている。
ちなみにキーはこんなふうに登録されているっぽい。

#myisam_ftdump -d /var/lib/mysql/hoge/t 1
        0            0.8787346 。
        0            0.8787346 が
        0            0.8787346 くん
        0            0.8787346 さん
        0            0.8787346 た
        0            0.8787346 に
        0            0.8787346 まし
        0            0.8787346 を
        0            0.8787346 貸し
        0            0.8787346 太郎
        0            0.8787346 山田
        0            0.8787346 本


今回のはテキスト解析のプラグインだったのですが、他にもプラグインの種類はあるっぽい。
ただ、betaなので今後色々変わるかもね。