適当に・・・

何の目的も無くブログを立ち上げてみました。更新は不定期ですね。

postgresql 全文検索 (Ludia)

2009年03月25日 14時59分43秒 | PostgreSQL
postgresql 全文検索

必要なもの
postgresql-8.2.12.tar.gz(好きなバージョンでOK)
ludia-withdeps-1.5.1.tar.gz (最新バージョンで)
[mecab,mecab-ipadic,sennaがついたパッケージ]

tar xvzf ludia-withdeps-1.5.1.tar.gz
cd ./ludia-1.5.1/deps/

(mecabインストール)
tar xzvf mecab-0.97.tar.gz
cd ./mecab-0.97
./configure --with-charset=utf8
make all
make install

(mecab辞書インストール)
cd ../
tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make all
make install

(sennaインストール ちょっと時間掛かる・・・)
cd ../
tar xvzf senna-1.1.3.tar.gz
cd senna-1.1.3
./configure
make all
make install

(ludiaのインストール)
cd ../../
./configure --with-pg-config=/usr/local/pgsql/bin/pg_config --with-senna-cfg=/usr/local/bin/senna-cfg
make all
make install

テスト用のDB作成
createdb sample2

/usr/local/pgsql/bin/psql -U postgres -f /usr/local/pgsql/share/pgsenna2.sql sample2

postgresql.confの最終行へ以下パラメータ追加

custom_variable_classes = 'ludia'
ludia.max_n_sort_result = 10000
ludia.enable_seqscan = on
ludia.seqscan_flags = 1
ludia.sen_index_flags = 31
ludia.max_n_index_cache = 16
ludia.initial_n_segments = 512

postgresqlの再起動もしくはreload

CREATE INDEX ftext ON item USING FULLTEXT(description);

******************** 補足 ***********************************

fulltext : 正規化 + 形態素解析 (SEN_INDEX_NORMALIZE)
fulltextb : 正規化 + 2-gram (SEN_INDEX_NORMALIZE|SEN_INDEX_NGRAM)
fulltextu : ユーザ定義

って言うのをしらずにずっとfulltextを使用していた。
書いてある通り fulltextb の方が2-ngramを使用するのでこっちがいいかも

CREATE INDEX ftext ON item USING FULLTEXTB(description);
って指定するんだってw

*****************************************************************

select itemid from item where description @@'テスト'

で結果が返ってくればOK

pgmecab よりは簡単かな。
後は精度と速度かな。。。。