全文検索 groonga を euc でインストール
MovableType のデフォルトの検索エンジンを groonga ベースで作り直そうと思い立ち、sakura VPS へ groonga をインストールしました。毎度のごとく、いろいろツボにはまったので、備忘録的にまとめておきます。
まずは groonga を知らない方への説明です。
groonga はオープンソースのカラムストア機能付き全文検索エンジンで、従来から広く使われてきた全文検索ライブラリ Senna の後継として開発されています。Senna との大きな違いは、HTTP などの複数プロトコルに対応したサーバ機能を保有し、ストレージ機能を保有する点です。
Senna を使う場合は MySQL + Tritonn という構成が一般的でしたが、groonga の場合は MySQL へ groonga ストレージエンジンとして組み込んで使うこともできるし、MySQL とは切り離して groonga 単体で使うこともできます。ただし Senna + Tritonn と比較して機能的には同等でない部分もあります。
全文検索 groonga を euc でインストール
今回は僕のブログ環境が euc-jp なので、euc 前提のインストールで話をすすめます。
groonga には、トークナイザとして、mecab、n-gram(unigram,bigram,trigram)、空白区切りが用意されています。当然ながらほとんどの人が、形態素解析タイプの mecab を使いたいと思うはずなので、mecab 周りのインストールから説明します。
cd /usr/local/src wget http://sourceforge.net/projects/mecab/files/mecab/0.98/mecab-0.98.tar.gz/download tar zxvf mecab-0.98.tar.gz cd mecab-0.98 ./configure --enable-shared --enable-mutex --with-pic make make check make install cd /usr/local/src wget http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz/download tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz cd mecab-ipadic-2.7.0-20070801 ./configure --with-pic make make check make install
次に groonga をインストールします。euc でのインストールなので encoding 指定をします。
cd /usr/local/src wget http://packages.groonga.org/source/groonga/groonga-1.2.7.tar.gz tar xvfz groonga-1.2.7.tar.gz cd groonga-1.2.7 ./configure --with-default-encoding=euc_jp make make check make install
ちなみに mecab のインストールにおいて
のように共有ライブラリを disable にしていると、groonga の configure 時に下記のようなエラーが発生します。その場合には、mecab のインストールからやり直す必要があります。
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
・・・中略・・・
checking for LIBEDIT... no
checking whether enable MeCab... yes
checking for mecab-config... /usr/local/bin/mecab-config
checking for library containing mecab_new... no
configure: error: "No libmecab found"
正常時には下記のようなメッセージが表示されているかと思います。
Tokenizers:
MeCab: yes
CPPFLAGS: -I/usr/local/include
LDFLAGS: -L/usr/local/lib
LIBS: -lmecab -lpthread
・・・中略・・・
Now type 'make' to build groonga 1.2.7!
次に MySQL へ groonga ストレージエンジンの組み込みとして mroonga のインストールを行います。
export GROONGA_CFLAGS="-I/usr/local/include/groonga" export GROONGA_LIBS="-L/usr/local/lib -lgroonga" cd /usr/local/src wget https://github.com/downloads/mroonga/mroonga/groonga-storage-engine-1.0.1.tar.gz --no-check-certificate tar xvfz groonga-storage-engine-1.0.1.tar.gz cd groonga-storage-engine-1.0.1 ./configure --with-mysql-source=/usr/local/src/mysql-5.1.60 --with-mysql-config=/usr/local/mysql/bin/mysql_config --with-default-parser=TokenMecab make make check make install
--with-mysql-source=/usr/local/src/mysql-5.1.60 オプションはMySQL をコンパイルしたときのソースコードのディレクトリの場所をしていします。mysql をデフォルトの場所にインストールしていない場合は、--with-mysql-config で場所を指定する必要があります。デフォルトインストールの場合は不要です。
--with-default-parser=TokenMecab オプションはデフォルトのトークナイザの指定です。無指定の場合は TokenBigram が使われるので mecab を使いたい場合は指定が必須です。
また、環境変数 GROONGA_CFLAGS と GROONGA_LIBS の設定も必要となります。groonga をインストールしたディレクトリを指定します。pkg-config がある場合は不要との情報もありますが、僕の環境は pkg-config が入っているけど、上記2つの環境変数をセットしないと configure で下記のエラーが発生しました。
checking pkg-config is at least version 0.9.0... yes
checking for GROONGA... no
configure: error: Package requirements (groonga >= 1.2.7) were not met:
No package 'groonga' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
and GROONGA_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
ここまでインストールができたら、あとは MySQL で groonga プラグインを有効にするだけです。
まずはコマンドラインから MySQL shell へ root ユーザでログインします。
mysq -u root -p
続いて MySQL shell 上から下記のコマンドを実行します。
INSTALL PLUGIN groonga SONAME 'ha_groonga.so'; CREATE FUNCTION last_insert_grn_id RETURNS INTEGER soname 'ha_groonga.so'; SHOW ENGINES;
うまくいった場合、下記のようにストレージエンジンに groonga が追加されているはずです。
+------------+---------+------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+------------------------------------------------------------+--------------+------+------------+ | groonga | YES | Fulltext search, column base | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | +------------+---------+------------------------------------------------------------+--------------+------+------------+
最後にもう一つバッドノウハウの共有をしておきます。僕は groonga のインストールを最初は --with-default-encoding=euc_jp オプションなしでインストールしてデータベースを作成していました。ブログが euc-jp なので euc な文字列でインデックスを作成しようとしていたので、groonga.log に下記のようなエラーが記録され、インデックスが正常に作成できませんでした。
2011-11-19 10:28:34.742938|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8 2011-11-19 10:28:34.743017|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8 2011-11-19 10:28:34.743176|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8 2011-11-19 10:28:34.743200|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8 2011-11-19 10:28:34.743282|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8 2011-11-19 10:28:34.743311|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8 2011-11-19 10:28:34.743360|w|41b67940|invalid utf8 string(1) on grn_str_charlen_utf8
途中で気がついて、with-default-encoding=euc_jp オプションを指定してコンパイルし直し、テーブルを削除&再作成するも、上記エラーが来ませんでした。
このエラーは groonga が作成したデータベースを再作成することで解決します。ただ、既存のデータベース上に create table で追加した場合には、drop database しちゃうと必要なものも全部消えちゃうので大変です。その場合は、drop table した後に groonga 関連のファイル一式を削除することで解決します。
具体的には groonga によって作成されるテーブルのファイルは、下記のような frm ファイルとして存在しています。drop table でこのファイルは削除されます。
-rw-rw---- 1 mysql mysql 8694 11月 19 10:50 entry_fulltext_search.frm
一方でインデックスの実体そのものは、下記のようなファイル群が存在しています。これらファイルは drop table では削除されないため、rm コマンドを使って OS レベルで削除します。
-rw-rw---- 1 mysql mysql 8437760 11月 19 10:50 drk7jp_mt6.mrn -rw-rw---- 1 mysql mysql 21245952 11月 19 10:50 drk7jp_mt6.mrn.0000000 -rw-rw---- 1 mysql mysql 4243456 11月 19 10:50 drk7jp_mt6.mrn.0000121 -rw-rw---- 1 mysql mysql 4096 11月 19 10:50 drk7jp_mt6.mrn.0000122 -rw-rw---- 1 mysql mysql 274432 11月 19 10:50 drk7jp_mt6.mrn.0000123 -rw-rw---- 1 mysql mysql 274432 11月 19 10:50 drk7jp_mt6.mrn.0000124 -rw-rw---- 1 mysql mysql 274432 11月 19 10:50 drk7jp_mt6.mrn.0000125 -rw-rw---- 1 mysql mysql 4243456 11月 19 10:50 drk7jp_mt6.mrn.0000126 -rw-rw---- 1 mysql mysql 561152 11月 19 10:50 drk7jp_mt6.mrn.0000127 -rw-rw---- 1 mysql mysql 4096 11月 19 10:50 drk7jp_mt6.mrn.0000127.c -rw-rw---- 1 mysql mysql 4243456 11月 19 10:50 drk7jp_mt6.mrn.0000128 -rw-rw---- 1 mysql mysql 561152 11月 19 10:50 drk7jp_mt6.mrn.0000129 -rw-rw---- 1 mysql mysql 4096 11月 19 10:50 drk7jp_mt6.mrn.0000129.c -rw-rw---- 1 mysql mysql 4243456 11月 19 10:50 drk7jp_mt6.mrn.000012A -rw-rw---- 1 mysql mysql 561152 11月 19 10:50 drk7jp_mt6.mrn.000012B -rw-rw---- 1 mysql mysql 4096 11月 19 10:50 drk7jp_mt6.mrn.000012B.c
正常にインデックスできている場合には、下記のような groonga.log の内容になるはずです。
2011-11-19 11:04:29.207024|n|41c44940|nterms=1924 chunk=0 total=0 2011-11-19 11:04:29.208449|n|41c44940|d0=963 d1=961 2011-11-19 11:04:29.622113|n|41c44940|nterms=2077 chunk=0 total=0 2011-11-19 11:04:29.623930|n|41c44940|d0=1039 d1=1038 2011-11-19 11:04:29.956236|n|41c44940|nterms=3108 chunk=0 total=96 ・・・中略・・・ 2011-11-19 11:04:32.182001|n|41c44940|nterms=2513 chunk=39017 total=1050 2011-11-19 11:04:32.183400|n|41c44940|d0=1329 d1=1184 2011-11-19 11:04:32.491810|n|41c44940|nterms=3738 chunk=110053 total=1123 2011-11-19 11:04:32.493669|n|41c44940|d0=2108 d1=1630
他の検索エンジンに比べると運用が簡単な部類なので groonga おすすめです。より高機能を求めるなら Apache solr へ行くことをおすすめします。
コメントやシェアをお願いします!