8.3の場合、TSearchがデフォルトで入っているが、英語にしか対応していないので
日本語での全文検索を行うためには、ライブラリを入れてあげる必要がある。
今回は、textsearch_jaというのを使うことに。
textsearch_jaを使うにはmecabが必要なので、まずはこれをインストール。
mecab
http://mecab.sourceforge.net/
手順
1、mecabの本体と辞書をダウンロードする
mecab-0.97.tar.gz
mecab-ipadic-2.7.0-20070801.tar.gz
2、mecabインストール(rootユーザで)
tar zxf mecab-0.97.tar.gz
cd mecab-0.97
./configure
make
make install
3、辞書のインストール(rootユーザで)
DBの文字コードがUTF-8なので、UTF-8で作成する。
tar zxf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
make install
4、LD_LIBRARY_PATHの設定
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
5、postgreSQLを再起動する
textsearch_ja
http://textsearch-ja.projects.postgresql.org/index-ja.html
手順
1、PostgreSQLのソースディレクトリにtextsearch_jaを展開する。
(/usr/local/src/postgresql-8.3.1/contrib)
2、以下を実行
make
sudo make install
pgsql -f textsearch_ja.sql DB名
注意点
・PostgreSQLをバイナリからインストールした場合は、先にビルドしておく必要がある
(configureとmakeまで)
・LD_LIBRARY_PATHの設定忘れに注意。設定後はpostgresを再起動しないとパスが読み込まれない
さて、全文検索の環境は整ったのでインデックスを作成。今回はGINを使う。
以下のSQLを実行。
CREATE INDEX インデックス名 on 対象テーブル名 USING gin(to_tsvector('japanese', カラム名))
GINインデックスの検索はGiSTの3倍くらい高速なんだそうだ。
ただし、インデックスの構築や更新に時間がかかるし、サイズも大きい。
システムの構成とかハードウェアの余力なんかを考えて決めるべきなんだろう・・・
まあ、検索の速さ重視で。
さて、いよいよ検索実行。
普通のSELECT文のWHERE句をちょっと変えるだけ。
SELECT * from テーブル名 WHERE to_tsvector('japanese', カラム名) @@ to_tsquery('japanese', '検索条件');
検索条件には、「AND」「OR」「NOT」の3種類の記号が使える。
それぞれ「&」「|」「!」。
&&とか||とか書かないことに注意。
こんな感じ?
SELECT * from テーブル名 WHERE to_tsvector('japanese', カラム名) @@ to_tsquery('japanese', '渋谷 & イタリアン');
以上。