Ludia(PostgreSQL+Senna)のインストール備忘録

PostgreSQLを使っていて、N-gramでサクっと全文検索したいなんて時。

・Ubuntuに入れたPostgreSQL8.3
・Fedoraに入れたPostgreSQL8.2

に、インストールしたので、その時の備忘録。

【PostgreSQL】

 UbuntuはPostgreSQLをパッケージで入れてたのですが、
 開発用のモジュール(なんちゃらdevel)とかがないよーって怒られるので、
 ソースからインストールしておきます。

【使ったtarball】

 senna-1.1.4.tar.gz
 ludia-1.5.2.tar.gz

【Sennaインストール】

 Ubuntuに入れたときは、configureした後に、makeとmake installをそのままやりましたが、
 とにかくアホみたいに時間がかかって、CPUリソースを食いました。

 調べてみたら↓らしいので # なんかRubyが悪いみたいな言い方じゃね?w

 nfkc.cは、ICUが行う正規化相当の正規化を行うソースです。 現段階では、UTF-8の正規化の場合のみ用います。
 このソースはRubyで自動生成されており、 大変コンパイル負荷がかかります。
 よって、一部環境ではコンパイルが完了しないといった現象が起こります。
 NFKCによる正規化が必要ない場合には、 以下のようにconfigureを行ってNFKCを無効にしてください。

 正規化止めちゃうとかイヤだったので、configure(N-gram用途なので、–without-mecabで)した後に、
 これまたネットで見つけた、
 以下のやり方で、nkfcだけ別途インストールしました。

 ( cd lib; ../libtool –tag=CC –mode=compile gcc -I. -I.. -Wall -O0 -fno-strict-aliasing -g -MT nfkc.lo -MD -MP -MF .deps/nfkc.Plo -c -o nfkc.lo nfkc.c )

 あとはmakeしてmake installするだけです。

【Ludiaのインストール】

 configureは以下のように、PostgreSQLのpg_configとSennaのsenna-configのパスを指定します。

 ./configure –with-pg-config=/usr/local/pgsql/bin/pg_config –with-senna-cfg=/usr/bin/senna-cfg

 あとはmake して make installするだけです。

 ただし、PostgreSQL8.3.6以降は、IndexBuildHeapScanって
 関数の引数が変更されててコンパイルが通らなかったので、
 青山ではたらくCTOのブログ: PostgreSQL 8.3.6 に ludia を入れた
 を参考にして、第四引数にfalseを設定しました。

【PostgreSQLの設定】

 postgresql.confの編集(どっかのページにあったのをまんまコピペw)
 #—————————————————————————
 # Ludia Options
 #—————————————————————————
 custom_variable_classes = ‘ludia’
 ludia.max_n_sort_result = 100000
 ludia.enable_seqscan = on
 ludia.sen_index_flags = 31

【PostgreSQL再起動】

 男なら黙って immediate っすw

 ./pg_ctl -D /usr/local/pgsql/data restart -m immediate

 っていうか、Slony-Ⅰでレプリケーションをしているわけですが、
 そいつのデーモンを止めずに強制的にやったけど、ちゃんと動いてくれました。
 # まぁ、ログはポロポロといろいろ出てたので、
 # さすがに商用環境だとサービス止めてから実行しないとね。。

【データベースに設定反映】

 /usr/local/pgsql/bin/psql -U postgres -f /usr/local/pgsql/share/pgsenna2.sql データベース名

 これでフルテキスト索引が貼れるようになります。

【カラムにフルテキスト索引を作成】

 create index インデックス名 on テーブル名 using fulltextb(カラム名);

【で、検索してみる】

 select * from テーブル名 where カラム名 @@ 検索文字列;

 キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

 ってなるはずですが、PostgreSQL8.3だとハマりました。
 PostgreSQL8.3からは、PostgreSQL自身が形態素解析の全文検索を実装したので、
 (日本語の全文検索はサポートしてないので、mecabとtextsearch-jaってのを使うらしい)
 その影響で、記法が@@から%%に変わってました。


N-gramは漏れなく引っかかる代わりに、ノイズが多くなります。
形態素解析は漏れが出てしまう可能性がありますが、精度が高いです。

が、サービスの運用も持ってる側からすると、気になるのは、インデックスで食う容量。
・N-gramだと、元のテキストの2~3倍
・形態素解析だと、元のテキストの1.5倍
とかだったり、するとかしないとか。

今回はとりあえず手軽にひっかけたいのでN-gramにしましたが、
なんちゅーか技術者的には、形態素解析の方がかっこいいかな、、とか。

来週あたり、そこそこの件数入れて、性能の検証したり、容量の検証をしたり、する予定です。

あとは、シソーラス辞書とかも使ってみたりしたい今日この頃です。
# 辞書に当てて、複数の単語をゲットしたら、それでOR検索なんていう。

コメント

タイトルとURLをコピーしました