実は上記の方法は日本語のデータではうまくいかない。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の全文検索機能は、検索結果をランク付けするなど、非常に多くの機能を持っている。詳細はドキュメントを参照されたい。