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をインストール
以下を参考にMeCabをUTF-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なので今後色々変わるかもね。