ニコニコニュースでも使われている全文検索パーサプラグイン「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対応を行いましたので記事にします。
リポジトリ
- https://github.com/y-ken/mysqlftppc-bigram
- https://github.com/y-ken/mysqlftppc-mecab
- https://github.com/y-ken/mysqlftppc-snowball
- https://github.com/y-ken/mysqlftppc-space
- https://github.com/y-ken/mysqlftppc-suffix
利用方法
動作確認環境
事前準備
インストール作業の前に、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_dicdir
はmecab --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)
最後に
より綺麗な手の入れ方があると思うので、是非皆様のプルリクエストをお待ちしております。
関連記事
全文検索エンジン Tritonn (MySQL-5.0+Senna) からMySQL-5.6対応「mysqlftppc」への移行ガイド
http://y-ken.hatenablog.com/entry/how-to-migrate-tritonn-to-mysqlftppc「mysql ftppc(full-text parser plugin collection)」に関するスライド・ブログ記事のまとめ
http://y-ken.hatenablog.com/entry/the-articles-about-mysqlftppcMySQL-5.6.4からの新機能「InnoDB FullText Search」という全文検索機能でWITH PARSERが動かないので調べてみました
http://y-ken.hatenablog.com/entry/mysql-innodb-parser-plugin