概要
@~
はPGroonga独自の演算子です。@~
演算子は、右辺のtext
型の値が、左辺のtext
型のサブセットの値なら真を返します。
構文
この演算子の構文は次の通りです。
text_column @~ text_query
text_column
はtext
型またはvarchar
型のカラムです。
text_query
はクエリーとして使うtext
型またはvarchar
型のカラムです。
使い方
例に使うサンプルスキーマとデータは次の通りです。
CREATE TABLE memos (
id integer,
content text
);
INSERT INTO memos VALUES (1, 'PostgreSQL is a RDBMS.');
INSERT INTO memos VALUES (2, 'Groonga is fast full text search engine.');
INSERT INTO memos VALUES (3, 'PGroonga is a PostgreSQL extension that uses Groonga.');
CREATE INDEX grnindex ON memos USING pgroonga (content pgroonga.text_regexp_ops);
pgroonga.XXX_regexp_ops``のXXXの部分はカラムの型によって異なる値を指定します。
- varcharの場合:
pgroonga.varchar_regexp_ops
を指定します。
- textの場合:
pgroonga.text_regexp_ops
を指定します。
カラムがvarcharの場合は、最大文字数は最大バイト数が4096バイト以下になるように指定する必要があります。PGroongaのインデックスの最大長は、4096バイトだからです。たとえば、UTF-8エンコーディングを使う場合は最大文字数は1023文字以下にする必要があります。なぜなら、UTF-8エンコーディングのvarcharは1文字あたり4バイト確保し、PostgreSQLはメタデータ用に4バイトを確保するからです。
なお、一般ユーザ権限で、CREATE INDEX
を実行する場合は、対象のユーザへpgroonga
スキーマのアクセス権限を付与しておきます。詳細はcreate extensions pgroonga
を参照してください。
シーケンシャルスキャンを無効にします。
SET enable_seqscan = off;
マッチする例は次の通りです。
SELECT id, content
FROM memos
WHERE content @~ 'groonga';
id | content
----+-------------------------------------------------------
2 | Groonga is fast full text search engine.
3 | PGroonga is a PostgreSQL extension that uses Groonga.
(2 rows)
右辺に指定する文字列は正規表現を利用します。また、アルファベットの場合はすべての文字を小文字にします。PGroongaはなるべくインデックスにヒットするようにすべての大文字を小文字に変換してから、インデックスに登録するからです。
つまり、検索文字に、pgroonga
を指定した場合は、pgroonga
、PGroonga
のどちらもヒットします。
正規表現の演算子を使った例は次のとおりです。
SELECT id, content
FROM memos
WHERE content @~ 'Groonga\.\z';
id | content
----+-------------------------------------------------------
3 | PGroonga is a PostgreSQL extension that uses Groonga.
(1 row)
マッチしない例は次のとおりです。
SELECT id, content
FROM memos
WHERE content @~ 'PGroonga';
id | content
----+-------------------------------------------------------
2 | Groonga is fast full text search engine.
3 | PGroonga is a PostgreSQL extension that uses Groonga.
(2 rows)
と思ったが、上記のクエリは結果が出力される。