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検索なんていう。
コメント