Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

ニコニコニュースでも使われている全文検索パーサプラグイン「MySQL-ftppc」のMySQL-5.6対応版を作りました

MySQL-ftppc (MySQL full-text parser plugin collection) という、全文検索パーサプラグインはご存じでしょうか。
これはMySQL標準の Full Text Parser を置き換えるもので、hiroaki-kawai氏によってこの世に生まれました。
ストレージはMyISAMを利用しますので、コンパクトなソースコードが特徴です。
パフォーマンスとしては400万行、インデックスファイル.MYIのサイズが2GBを対象の検索で0.8秒程と、決して速くは無いので、100万行くらいまでのデータ向きです。

Tritonn (MySQL-5.0 + Senna)を利用しており、InnoDBの性能向上を主な目的としてMySQL-5.5や5.6への移行を望んでいるが、全文検索の扱いに困っている方 にオススメです。
ニコニコニュースなどで採用されているという実績も心強いですね。

仕組みを理解する上では、以下のスライドが分かりやすいです。

そう、このパーサプラグインが開発された2010年というと、 MySQL-5.1 が主流だった頃のものです。 MySQL-5.5対応化手順は以下ブログで紹介されていますが、MySQL-5.6で動かすためにはさらにもう一手間必要な事が分かりました。

MySQL full-text parser plugin collectionのmecab pluginを入れる
MySQL5.5.20にMySQL full-text parser plugin collectionのmecab pluginを入れた時にエラーが出たのでインストールの方法も含め記事を書きたいと思います。 http://kouhei.hatenablog.com/entry/20120209/1328768483

具体的には、以下のエラーが発生するため、プラグインの登録が出来ません。

mysql> install plugin mecab soname 'libftmecab.so';
ERROR 1126 (HY000): Can't open shared library '/usr/lib64/mysql/plugin/libftmecab.so' (errno: 13 /usr/lib64/mysql/plugin/libftmecab.so: undefined symbol: _db_enter_)

欲しい物が無いなら作ってしまえという私の信念に従い、今回これらすべてのMySQL-5.6対応を行いましたので記事にします。

リポジトリ

利用方法

動作確認環境

事前準備

インストール作業の前に、unicodeの正規化に必要なICUライブラリをインストールしましょう。
2013/05/09時点では、baseリポジトリにあるlibicu-devel-4.2.1-9.1.el6_2.x86_64.rpmが入りました。

$ sudo yum install libicu-devel

mysqlftppc bigram plugin

n-gramの1つである、2文字毎に分かち書きをするbi-gramを利用するプラグインです。
https://github.com/y-ken/mysqlftppc-bigram

本体のインストール

$ git clone https://github.com/y-ken/mysqlftppc-bigram.git
$ cd mysqlftppc-bigram
$ aclocal && libtoolize --automake && automake --add-missing && automake && autoconf
$ ./configure --with-mysql-config=`which mysql_config` --with-icu-config=`which icu-config`
$ make
$ sudo make install
$ mysql -uroot -p -e "install plugin bigram soname 'libftbigram.so';"

動作確認

mysql> CREATE TABLE ft_bigram (c TEXT, FULLTEXT(c) WITH PARSER bigram) ENGINE=MyISAM DEFAULT CHARSET=utf8;
mysql> INSERT INTO ft_bigram VALUES("今日の天気は晴れです。");
mysql> SELECT * FROM ft_bigram WHERE MATCH(c) AGAINST('+"今日の天気"' IN BOOLEAN MODE);
mysql> SELECT * FROM ft_bigram WHERE MATCH(c) AGAINST('+"れで"' IN BOOLEAN MODE);

mysqlftppc mecab plugin

mecabを用いて文字列を分かち書きするプラグインです。
https://github.com/y-ken/mysqlftppc-mecab

mecabのインストール

まずは分かち書きに使うmecabを入れます。
手っ取り早いgroongaのリポジトリにあるものを拝借します。
辞書はipadicを利用しておりますが、お好きなもので構いません。

$ sudo yum localinstall http://packages.groonga.org/centos/6/x86_64/Packages/mecab-0.996-1.el6.x86_64.rpm \
  http://packages.groonga.org/centos/6/x86_64/Packages/mecab-devel-0.996-1.el6.x86_64.rpm \
  http://packages.groonga.org/centos/6/x86_64/Packages/mecab-ipadic-2.7.0.20070801-6.el6.1.x86_64.rpm

my.cnfの修正

以下内容を/etc/my.cnf[mysqld]セクションへ追記します。
mecab_dicdirmecab --dump-config | grep dicdirの実行結果のパスを記入しましょう。

# mysqlftppc
mecab_normalization = KC
mecab_unicode_version = 3.2
mecab_dicdir = /usr/lib64/mecab/dic/ipadic

追記が終わりましたら、mysqldの再起動を行います。

本体のインストール

$ git clone https://github.com/y-ken/mysqlftppc-mecab.git
$ cd mysqlftppc-mecab
$ aclocal && libtoolize --automake && automake --add-missing && automake && autoconf
$ ./configure --with-mysql-config=`which mysql_config` --with-mecab-config=`which mecab-config` --with-icu-config=`which icu-config`
$ make
$ sudo make install
$ mysql -uroot -p -e "install plugin mecab soname 'libftmecab.so';"

動作確認

$ mysql -uroot test
mysql> CREATE TABLE ft_mecab (c TEXT, FULLTEXT(c) WITH PARSER mecab) ENGINE=MyISAM DEFAULT CHARSET=utf8;
mysql> INSERT INTO ft_mecab VALUES("今日の天気は晴れです。");
mysql> SELECT * FROM ft_mecab WHERE MATCH(c) AGAINST('+"今日の天気"' IN BOOLEAN MODE);

mysqlftppc snowball plugin

snowballライブラリを用いた、文字列から単語を抽出し、複数形など活用が変わっても検索できる事が特徴のプラグインです。
https://github.com/y-ken/mysqlftppc-snowball

本体のインストール

$ git clone https://github.com/y-ken/mysqlftppc-snowball.git
$ cd mysqlftppc-snowball
$ aclocal && libtoolize --automake && automake --add-missing && automake && autoconf
$ ./configure --with-mysql-config=`which mysql_config` --with-icu-config=`which icu-config`
$ make
$ sudo make install
$ mysql -uroot -p -e "install plugin bigram soname 'libftsnowball.so';"

動作確認

mysql> CREATE TABLE ft_snowball (c TEXT, FULLTEXT(c) WITH PARSER snowball) ENGINE=MyISAM DEFAULT CHARSET=utf8;
mysql> INSERT INTO ft_snowball VALUES("snowball sampling");
mysql> SELECT * FROM ft_snowball WHERE MATCH(c) AGAINST('+"sample"' IN BOOLEAN MODE);

mysqlftppc space plugin

スペース区切りで分かち書きを行う、タグ検索などに便利なプラグインです。 https://github.com/y-ken/mysqlftppc-space

本体のインストール

$ git clone https://github.com/y-ken/mysqlftppc-space.git
$ cd mysqlftppc-space
$ aclocal && libtoolize --automake && automake --add-missing && automake && autoconf
$ ./configure --with-mysql-config=`which mysql_config` --with-icu-config=`which icu-config`
$ make
$ sudo make install
$ mysql -uroot -p -e "install plugin bigram soname 'libftspace.so';"

動作確認

mysql> CREATE TABLE ft_space (c TEXT, FULLTEXT(c) WITH PARSER space) ENGINE=MyISAM DEFAULT CHARSET=utf8;
mysql> INSERT INTO ft_space VALUES("MySQL MyISAM");
mysql> INSERT INTO ft_space VALUES("MySQL InnoDB");
mysql> SELECT * FROM ft_space WHERE MATCH(c) AGAINST('+"MySQL"' IN BOOLEAN MODE);

mysqlftppc suffix plugin

suffix arrayを用いたプラグインです。 https://github.com/y-ken/mysqlftppc-suffix

本体のインストール

$ git clone https://github.com/y-ken/mysqlftppc-suffix.git
$ cd mysqlftppc-suffix
$ aclocal && libtoolize --automake && automake --add-missing && automake && autoconf
$ ./configure --with-mysql-config=`which mysql_config` --with-icu-config=`which icu-config`
$ make
$ sudo make install
$ mysql -uroot -p -e "install plugin bigram soname 'libftsuffix.so';"

動作確認

mysql> CREATE TABLE ft_suffix (c TEXT, FULLTEXT(c) WITH PARSER suffix) ENGINE=MyISAM DEFAULT CHARSET=utf8;
mysql> INSERT INTO ft_suffix VALUES("今日の天気は晴れです。");
mysql> SELECT * FROM ft_suffix WHERE MATCH(c) AGAINST('+"今日の天気"' IN BOOLEAN MODE);

まとめ

本日、MySQL-5.6で全文検索を行う時の選択肢が1つ増えました。
Tritonn (MySQL-5.0+Senna) と同じくMyISAMをストレージエンジンとして利用するため、
InnoDBの性能向上を主な目的としてMySQL-5.5や5.6を利用したいが、全文検索の扱いに困っている場合には、mroonga以外の選択肢として、このmysqlftppcを検討しても良いかもしれません。

なお、インストールしたプラグインは、以下のように確認出来ます。

mysql> show plugins;
+----------------------------+--------+--------------------+------------------+---------+
| Name                       | Status | Type               | Library          | License |
+----------------------------+--------+--------------------+------------------+---------+
...snip...
| mecab                      | ACTIVE | FTPARSER           | libftmecab.so    | BSD     |
| bigram                     | ACTIVE | FTPARSER           | libftbigram.so   | BSD     |
| suffix                     | ACTIVE | FTPARSER           | libftsuffix.so   | BSD     |
| space                      | ACTIVE | FTPARSER           | libftspace.so    | BSD     |
| snowball                   | ACTIVE | FTPARSER           | libftsnowball.so | BSD     |
+----------------------------+--------+--------------------+------------------+---------+
48 rows in set (0.00 sec)

最後に

より綺麗な手の入れ方があると思うので、是非皆様のプルリクエストをお待ちしております。

関連記事