N-gram を使用した、組み込み型の日本語全文検索です。
日本語テキストの全文検索を行います。 形態素解析ベースである textsearch-ja とは異なり、textsearch_senna では N-gram ベースの全文検索を行います。 検索には、全文検索エンジン Senna を使用しています。
利点として、文字すべてをインデックス化するため LIKE 中間一致検索に近い結果を得ることができます。 また、既に tsearch2 互換のインタフェースを備えるため、少々の設定変更で textsearch-ja と textsearch_senna を切り替えて使用することができます。
ただし、クラッシュ・リカバリやアーカイブ・リカバリに対応していないことに注意してください。リカバリ後にインデックスの再作成を行う必要があります。
OPERATOR %% (document text, query text) が追加されます。 以下の形式で使用します。
=# SELECT * FROM tbl WHERE document %% '検索キーワード';
組み込みの全文検索との互換性向上のため、OPERATOR @@ (document text, query senquery) も登録されています。
=# SELECT * FROM tbl WHERE senna.to_tsvector(document) @@ senna.to_tsquery('検索キーワード');
senna.to_tsvector(), senna.to_tsquery() を組み込みの同名の関数よりも優先して使用する場合は、設定パラメータ search_path を 'senna', 'pg_catalog' の順に検索するよう設定します。
=# SET search_path = 'senna','pg_catalog','$user','public';
=# SELECT * FROM tbl WHERE to_tsvector(document) @@ to_tsquery('検索キーワード');
'senna' というインデックス・アクセス・メソッドが登録されます。 CREATE INDEX の際に USING senna を指定することで使用できます。
=# CREATE TABLE test (id serial, t text);
=# COPY test(t) FROM '...';
=# CREATE INDEX idx ON test USING senna (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)
CREATE INDEX の際に WITH 句でインデックス・オプションを指定できます。