Groonga エンジンを利用した汎用インデックスです。 “textsearch”_groonga というモジュール名ですが、N-gram を使用した日本語全文検索の他、btree と同様のスカラー値の検索もサポートしています。 ライセンスは PostgreSQL License と同様の、BSD/MITライセンスです。
日本語テキストの全文検索を行います。 形態素解析ベースである textsearch-ja とは異なり、textsearch_groonga では N-gram ベースの全文検索を行います。 検索には、全文検索エンジン / 列指向データベースである Groonga を使用しています。
textsearch_senna と比較して、以下の類似点や相違点があります。
利点以下の外部プロジェクトに依存しています。
最初に PostgreSQL をインストールします。 ソースコード全体は必ずしも必要ではありませんが、開発用パッケージ (postgresql-devel 等) は必要です。 また、PostgreSQL の実行ファイルを PATH に加えてください。 pg_config コマンドにパスが通っている必要があります。
次に groonga をインストールします。 詳しくは groonga のインストール方法を参照してください。 バイナリ・パッケージを yum 等を使ってインストールするか、ソースコードからビルドします。 ビルドする場合には、環境によっては make に長時間 (数分~数10分) かかる場合があるようです。
その後、textsearch_groonga をビルドします。 pgxs フレームワークを利用しているため、前もって pg_config にパスを通してください。
$ cd textsearch_groonga $ make $ su $ make install
その後、データベースに関数を登録します。
$ pg_ctl start $ psql -f $PGSHARE/contrib/textsearch_groonga.sql -d YOUR_DATABASE
アンインストールをするとすべてのインデックスも同時に削除されます。 テーブルのデータは削除しないため、元のテキストは残っているはずですが、必要なデータが CASCADE で削除されないよう注意してください。
$ psql -f $PGSHARE/contrib/uninstall_textsearch_groonga.sql -d YOUR_DATABASE
一般的な比較演算子に加え、全文検索用の %% 演算子と、groonga クエリを直接記述できる @@ 演算子をサポートしています。
ただし、現在のバージョンでは textsearch_senna とは異なり、LIKE 演算子はサポートしていません。 また、CREATE INDEX の際に WITH 句で指定できるインデックス・オプションはありません。
'groonga' というインデックス・アクセス・メソッドが登録されます。 CREATE INDEX の際に USING groonga を指定することで使用できます。
=# CREATE TABLE test (id serial, t text); =# COPY test(t) FROM '...'; =# CREATE INDEX idx ON test USING groonga (t); =# ANALYZE; =# EXPLAIN SELECT * FROM test WHERE t %% 'リレーショナルデータベース'; QUERY PLAN -------------------------------------------------------------------- Index Scan using idx on test (cost=0.00..55.01 rows=615 width=36) Index Cond: (t %% 'リレーショナルデータベース'::text) (2 rows)
スカラー値用の比較演算子 (>, >=, =, <=, <, <>) はすべて利用できます。 btree インデックスと同等の機能に加え、不等号 (<>) でも groonga インデックスを使用できます。
OPERATOR %% (document text, query text) が追加されます。 以下の形式で使用します。
=# SELECT * FROM tbl WHERE document %% '検索キーワード';
@@ 演算子では、groonga が持つすべての検索機能を利用することができます。
=# SELECT * FROM tbl WHERE document @@ groonga.query('postgresql OR postgres', 'title*2:document');
この演算子は、通常の PostgreSQL の絞り込み検索を逸脱した検索を行います。 @@ の左辺の列名は、使用する groonga インデックスの列の任意のいずれか1つで構いません。 実際に検索条件として使う列は、groonga.query() で与えます。
groonga.query() は、gronnga 用の検索クエリを直接記述するための関数です。 引数 query, match_columns, scorer, filter は、groonga の select コマンドのそれぞれの引数に対応します。 この形式を利用すると、groonga が検索条件全体を一括で利用でき、特に OR を含むような条件を効率的に扱えます。 また、結果をスコアリングし、重みづけをすることができます。
groonga.score(tableoid, ctid) を使うと、その行の検索スコアを取得できます。 何も指定しなければ groonga のデフォルトの重みづけになります。 また groonga.query() を利用して独自に重みづけすることもできます。 groonga.score() 関数は ORDER BY 句で指定することを想定しており、例えば「タイトル」にキーワードが含まれる場合を、「本文」の場合よりも上位に表示したい場合に役立ちます。
使用例
=# SELECT * FROM document WHERE body %% 'keyword' ORDER BY groonga.score(tableoid, ctid);
不具合 現在のバージョンでは、行が更新されるとスコアとしてゼロが返る可能性があります。
textsearch_groonga を登録したデータベースをバックアップする際には、以下に注意してください。
現在 PostgreSQL のインデックスを削除しても、groonga のデータファイルは削除されません。 不要なファイルを完全に削除するには、DROP DATABASE / CREATE DATABASE でデータベース全体を再作成してください。
groonga インデックスは ANALYZE で収集される統計情報を利用しません。 そのため、統計情報ヒストグラムを作成しないように設定することで、ディスク容量やCPUコストを節約できます。 groonga インデックスを張ったカラムのみ統計情報を収集しないように設定するには、ALTER TABLE SET STATISTICS を使います。
=# ALTER TABLE tbl ALTER COLUMN document SET STATISTICS 0;