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 句でインデックス・オプションを指定できます。
Senna インデックスは標準 DROP INDEX や REINDEX REINDEX ではなく、専用の関数を使ってメンテナンスを行ってください。インデックスの削除が発生する可能性のあるSQLは以下になります。これらを実行すると、不要ファイルが残ってしまいます。
DROP INDEX の代わりに senna.drop_index() 関数を使ってください。
=# SELECT senna.drop_index('index_name');
REINDEX の代わりに senna.reindex_index() 関数を使ってください。
=# SELECT senna.reindex_index('index_name');
textsearch_senna が利用する Senna ライブラリは、PostgreSQL 標準のインデックス・ファイルのほかに、以下のファイルを利用します。インデックス・ファイルが削除される際には、これらのファイルも削除する必要があります。
残ってしまった不要ファイルを調査するために、以下のビューを用意しています。
CREATE VIEW senna.all_files; -- 全てのデータベース・ファイル
CREATE VIEW senna.index_files; -- 全ての senna インデックス・ファイル
CREATE VIEW senna.orphan_files; -- 不要な senna インデックス・ファイル
不要ファイルを削除するには、contrib/adminpack をインストールした上で、下記のSQLを発行します。
=# CHECKPOINT; -- PostgreSQL のファイルを削除するため。
=# SELECT pg_file_unlink(file) FROM senna.orphan_files;