これはPGroonga 1.X用のドキュメントです。新しいPGroongaを使っているならPGroonga 2.xのドキュメントを見てください。
&@*
演算子1.2.1で追加。
&~?
演算子は1.2.2から非推奨です。代わりに&@*
演算子を使ってください。
&@*
演算子は類似文書検索を実行します。
column &@* document
column
は検索対象のカラムです。型はtext
型、text[]
型、varchar
型のどれかです。
document
は類似文書検索で使う文書です。column
がtext
型またはtext[]
型の場合は型はtext
型です。column
がvarchar
型の場合は型はvarchar
型です。
類似文書検索はdocument
のコンテンツに似たレコードを探します。もし、document
のコンテンツが短かった場合、類似文書検索はそれほど似ていないレコードも返してしまうかもしれません。
この演算子を使うには次のどれかの演算子クラスを指定する必要があります。
pgroonga.text_full_text_search_ops_v2
:text
用
pgroonga.text_array_full_text_search_ops_v2
:text[]
用
pgroonga.varchar_full_text_search_ops_v2
:varchar
用
例に使うサンプルスキーマとデータは次の通りです。
CREATE TABLE memos (
id integer,
content text
);
CREATE INDEX pgroonga_content_index ON memos
USING pgroonga (content pgroonga.text_full_text_search_ops_v2);
INSERT INTO memos VALUES (1, 'PostgreSQLはリレーショナル・データベース管理システムです。');
INSERT INTO memos VALUES (2, 'Groongaは日本語対応の高速な全文検索エンジンです。');
INSERT INTO memos VALUES (3, 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。');
INSERT INTO memos VALUES (4, 'groongaコマンドがあります。');
&@*
演算子を使うと指定した文書と似たレコードを検索できます。
SELECT * FROM memos WHERE content &@* 'MroongaはGroongaを使うMySQLの拡張機能です。';
-- id | content
-- ----+---------------------------------------------------------------------------
-- 3 | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。
-- (1 row)
シーケンシャルスキャンでは類似文書検索を使うことはできません。シーケンシャルスキャンで類似文書検索を使うと次のエラーが返ります。
SELECT * FROM memos WHERE content &@* 'MroongaはGroongaを使うMySQLの拡張機能です。';
-- ERROR: pgroonga: operator &@* is available only in index scan
日本語の文書を類似文書検索する場合はデフォルトのTokenBigram
ではなくTokenMecab
を使う方がよいです。
CREATE INDEX pgroonga_content_index ON memos
USING pgroonga (content pgroonga.text_full_text_search_ops_v2)
WITH (tokenizer='TokenMecab');
TokenMecab
は対象の文書を(ほぼ)単語にトークナイズします。これにより類似文書検索の精度が上がります。
TokenMecab
トークナイザーの指定方法についてはCREATE INDEX USING pgroonga
も参照してください。