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

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

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

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

PostgreSQL

 UbuntuPostgreSQLをパッケージで入れてたのですが、  開発用のモジュール(なんちゃら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とSennasenna-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検索なんていう。