実は上記の方法は日本語のデータではうまくいかない。PostgreSQLの全文検索は、単語が空白で区切られていることを前提にしているからだ。つまり、いわゆる「分かち書き」へ変換する必要がある。幸い、オープンソースで利用できるツールがいくつかあるのでそれを利用するとよいだろう。
ここでは、それらの中の1つの"mecab"を使い、PostgreSQLの関数の形で利用できるツールが公開されているのでそれを利用してみよう(と言っても筆者が開発したものだが)。
システムにmecabをインストールする。Vine Linuxでは、以下のパッケージが必要だ。
- mecab-0.96-0vl1
- mecab-devel-0.96-0vl1
- mecab-ipadic-2.7.0.20070801-0vl1
このサイトからpostgresql-full-text-search.tar.gzを入手する。展開すると、postgresql-full-text-searchというディレクトリができる。その中の"wakachi"がこのツールだ。このディレクトリを丸ごとインストールに使用したPostgreSQL 8.3beta2のソースツリーにコピーする。
$ cp -rp postgresql-full-text-search/wakachi /usr/local/src/postgresql-8.3beta2/contrib
$ cd /usr/local/src/postgresql-8.3beta2/contrib/wakachi
ここで、wakachi.sql.inの7行目の
LANGUAGE 'C' STRICT;
を
LANGUAGE C IMMUTABLE STRICT;
に変更する。wakachiはPostgreSQL 8.2で動作検証が行われており、8.3ではこの変更が必要になる。
$ make
$ make install
$ psql -f wakachi.sql test
以上でwakachiが使えるようになった。使い方は以下のようになる。
test=# SELECT wakachi('東京都と京都');
wakachi
-----------------
東京 都 と 京都
(1 row)
ご覧のように、単語が空白によって区切られ、「分かち書き」になっている。注目したいのは、「東京都」が「東京」と「都」で分けられ、「東」と「京都」にはなっていないことだ。これは、mecabが内蔵する辞書に「東京」が登録されているためである。このあたりは、分かち書きを行うソフトの性能もさることながら、辞書の出来にも依存するところである。
それともう一点注意することがある。
wakachiの入力出力文字コードは、mecabの文字コードに合わせなければならない。Vine Linuxをはじめ、多くのディストリビューションではmecabはEUC-JPを扱うようにインストールされていることが多い。そこでwakachiを使うPostgreSQLデータベースも、エンコーディングをEUC_JPにしておく。逆にmecabがUTF-8でインストールされている環境では、データベースもUTF_8にしなければならない。
wakachiを使った場合は、インデックスの作成方法は以下になる。
CREATE INDEX t1index ON t1 USING gin(to_tsvector('english',wakachi(t)));
検索方法は次のようになる。
SELECT * FROM t1 WHERE 'foo' @@ to_tsvector('english',wakachi(t));
PostgreSQLの全文検索機能は、検索結果をランク付けするなど、非常に多くの機能を持っている。詳細はドキュメントを参照されたい。