これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。

&@*演算子

1.2.1で追加。

&~?演算子は1.2.2から非推奨です。代わりに&@*演算子を使ってください。

概要

&@*演算子は類似文書検索を実行します。

構文

column &@* document

columnは検索対象のカラムです。型はtext型、text[]型、varchar型のどれかです。

documentは類似文書検索で使う文書です。columntext型またはtext[]型の場合は型はtext型です。columnvarchar型の場合は型はvarchar型です。

類似文書検索はdocumentのコンテンツに似たレコードを探します。もし、documentのコンテンツが短かった場合、類似文書検索はそれほど似ていないレコードも返してしまうかもしれません。

演算子クラス

この演算子を使うには次のどれかの演算子クラスを指定する必要があります。

使い方

例に使うサンプルスキーマとデータは次の通りです。

CREATE TABLE memos (
  id integer,
  content text
);

CREATE INDEX pgroonga_content_index ON memos
  USING pgroonga (content);
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)
  WITH (tokenizer='TokenMecab');

TokenMecabは対象の文書を(ほぼ)単語にトークナイズします。これにより類似文書検索の精度が上がります。

TokenMecabトークナイザーの指定方法についてはCREATE INDEX USING pgroongaも参照してください。