これは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のインデックスに指定した検索オプションを使えるようにするために使われます。

演算子クラス

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

使い方

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

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)

参考