これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
&^
演算子1.2.1で追加。
1.2.1からtext[]
用の&^>
演算子は非推奨になりました。代わりに&^
演算子を使ってください。
&^
演算子は前方一致検索を実行します。
前方一致検索は入力補完機能を実現する場合に便利です。
column &^ prefix
column &^ (prefix, NULL, index_name)::pgroonga_full_text_search_condition
column &^ pgroonga_condition(prefix, index_name => 'index_name')
多くの場合は1つ目の使い方で十分です。
2つ目の使い方はPGroongaのインデックスが使用されるかどうかに関わらず、カスタマイズしたノーマライザーを使用するためのものです。 2つ目の使い方は、2.4.6から使えます。
3つ目の使い方は2つ目と同じ意味です。3.1.6以降は3つ目の構文を使ってください。詳しくはpgroonga_condition
関数をご覧ください。
以下は1つ目の使い方の説明です。
column &^ prefix
column
は検索対象のカラムです。型はtext
型かtext[]
型です。
prefix
は含まれているべきプレフィックスです。text
型です。
column
の値がprefix
から始まっていればtrue
を返します。
以下は2つ目の使い方の説明です。
column &^ (prefix, NULL, index_name)::pgroonga_full_text_search_condition
column
は検索対象のカラムです。型はtext
型かvarchar
型です。
prefix
は含まれているべきプレフィックスです。text
型です。
2つ目の引数はNULLのみ設定されます。この構文は検索スコアーの最適化をするためのものでは無いためです。
index_name
は対応するPGroongaのインデックス名です。text
型です。
これはシーケンシャルサーチのときにもPGroongaのインデックスに指定した検索オプションを使えるようにするために使われます。
この演算子を使うには次のどれかの演算子クラスを指定する必要があります。
pgroonga_text_term_search_ops_v2
:text
用
pgroonga_text_array_term_search_ops_v2
:text[]
用
pgroonga_varchar_term_search_ops_v2
:varchar
用
例に使うサンプルスキーマとデータは次の通りです。
CREATE TABLE tags (
name text PRIMARY KEY
);
CREATE INDEX pgroonga_tag_name_index ON tags
USING pgroonga (name pgroonga_text_term_search_ops_v2);
INSERT INTO tags VALUES ('PostgreSQL');
INSERT INTO tags VALUES ('Groonga');
INSERT INTO tags VALUES ('PGroonga');
INSERT INTO tags VALUES ('pglogical');
&^
演算子を使うと指定したプレフィックスで前方一致検索を実行できます。
SELECT * FROM tags WHERE name &^ 'pg';
-- name
-- -----------
-- PGroonga
-- pglogical
-- (2 rows)
以下のように前方一致検索でカスタマイズしたノーマライザーを使えます。
CREATE TABLE tags (
name text
);
CREATE INDEX pgroonga_tag_name_index ON tags
USING pgroonga (name pgroonga_text_term_search_ops_v2)
WITH (normalizers='NormalizerNFKC150("remove_symbol", true)');
INSERT INTO tags VALUES ('PostgreSQL');
INSERT INTO tags VALUES ('Groonga');
INSERT INTO tags VALUES ('PGroonga');
INSERT INTO tags VALUES ('pglogical');
PGroongaのインデックスが使用されるかどうかに関わらず、カスタマイズしたノーマライザーで前方一致検索ができます。
SET enable_seqscan = on;
SET enable_indexscan = off;
SET enable_bitmapscan = off;
EXPLAIN (COSTS OFF)
SELECT name
FROM tags
WHERE name &^ ('-p_G', NULL, 'pgroonga_tag_name_index')::pgroonga_full_text_search_condition;
QUERY PLAN
Seq Scan on tags
Filter: (name &^ '(-p_G,,pgroonga_tag_name_index)'::pgroonga_full_text_search_condition)
(2 rows)
SELECT name
FROM tags
WHERE name &^ ('-p_G', NULL, 'pgroonga_tag_name_index')::pgroonga_full_text_search_condition;
name
-----------
PGroonga
pglogical
(2 rows)
同じクエリをpgroonga_condition
関数を使うと以下の通りです。
EXPLAIN (COSTS OFF)
SELECT name
FROM tags
WHERE name &^ pgroonga_condition('-p_G', index_name => 'pgroonga_tag_name_index');
QUERY PLAN
-------------------------------------------------------------------------------
Seq Scan on tags
Filter: (name &^ '(-p_G,,,,pgroonga_tag_name_index,,)'::pgroonga_condition)
(2 rows)
SELECT name
FROM tags
WHERE name &^ pgroonga_condition('-p_G', index_name => 'pgroonga_tag_name_index');
name
-----------
PGroonga
pglogical
(2 rows)