全文検索 groonga を euc でインストール

MovableType のデフォルトの検索エンジンを groonga ベースで作り直そうと思い立ち、sakura VPS へ groonga をインストールしました。毎度のごとく、いろいろツボにはまったので、備忘録的にまとめておきます。

img001.jpg

まずは 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 のインストールにおいて

./configure --disable-shared

のように共有ライブラリを disable にしていると、groonga の configure 時に下記のようなエラーが発生します。その場合には、mecab のインストールからやり直す必要があります。

checking for a BSD-compatible install... /usr/bin/install -c
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 for pkg-config... /usr/bin/pkg-config
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.

Alternatively, you may set the environment variables GROONGA_CFLAGS
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 へ行くことをおすすめします。

- スポンサーリンク -