8.2の正式リリース時期は?

 現在β3までリリースされているPostgreSQL 8.2の正式版のリリース時期だが,この記事を執筆している時点では12月5日とされている。少し早めのクリスマスプレゼントという感じのリリースになりそうだ。楽しみにしておこう。

GIN再び

 PostgreSQLウォッチ第30回ではPostgreSQL 8.2の追加機能について報告した。今回は,そのとき取り上げた汎用転置インデックスGINに関する追加調査結果を報告する。

 GINを使うと今まで不可能だった,データベース中のテキストのインデックスを使った高速な全文検索が可能であることは既に報告したとおりだ。しかし,その後しばらく使ってみると,いくつか問題点が見つかった。

(1) 重複した単語が登録されるので無駄

(2) 大きなテキストでは,データ登録に時間がかかるだけでなく,メモリーを消費する

(1)に関してはGINにテキストを登録する前に前処理すればよい。しかし,(2)は致命的で,ちょっと大きなテキストだと数GBもメモリーを消費し,システムがハングアップすることもあった。ただし,これはGINの問題ではなく,単語を分かち書きしたテキストを配列に変換する PostgreSQL の組み込み関数string_to_array の問題である。

 そこで今回tsearch2をGINを組み合わせて利用してみることにした。tsearch2では,登録時に重複テキストを排除してくれるし,string_to_array を使っていないのでこうした問題が回避できると思ったからである。

tsearch2とは

 tsearch2は,PostgreSQLのcontribモジュール(ソースに付属するが,デフォルトではインストールされないモジュール)である。tsearch2はPostgreSQLで全文検索を実現するためのツールであるが,単なるツールというよりは,全文検索システムを実現するためのフレームワークと言った方がふさわしいツールだ。

 tsearch2では,英語やロシア語といった言語ごとに,"the"などの登録不要な単語(「ストップワード」と呼ばれる) や同義語,テキストをパースして単語を切り出すための処理,辞書などを登録できる。

 また,単に全文検索を実行するだけでなく,「ランキング」といって,テキスト中の検索後の出現頻度の多さによって結果を順に表示することもできる(ただし今回紹介する方法でデータ登録した場合にはこのランキングなどの機能は利用できない)。

tsearch2とGINの組み合わせ

 tsearch2は,全文検索用のインデックス方式として,GiSTとGINをサポートしている。もちろん今回はtsearch2+GINの構成を選択した。

 残念ながら日本語用のパーサーや辞書は用意されていないので,あらかじめ分かち書きをしたテキストを作成の上,tsearch2に投入することにした。

まずはPostgreSQL 8.2β版をインストールする。