眠る開発屋blog ある開発屋の雑感。日々勉強。

2007/1/3 水曜日

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

Filed under: 技術メモ — タグ: , — dev0000 @ 13:22:56

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 [/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なので今後色々変わるかもね。

Powered by WordPress