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

pgroonga_query_expand関数

1.2.2で追加。

概要

pgroonga_query_expand関数はクエリー構文を使ったクエリー内にある登録済みの同義語を展開します。クエリー構文は&@~演算子&@~|演算子で使われています。

pgroonga_query_expand関数はクエリー展開機能を実現するときに便利です。Groongaのクエリー展開機能のドキュメントも参照してください。

構文

この関数の構文は次の通りです。

text pgroonga_query_expand(table_name,
                           term_column_name,
                           synonyms_column_name,
                           query)

table_nametext型の値です。同義語を格納している既存のテーブルの名前を指定します。

term_column_nametext型の値です。table_nameテーブル内の展開対象の単語を格納しているカラムの名前を指定します。このカラムはtext型のカラムです。

synonyms_column_nametext型の値です。termカラムの同義語を格納しているカラム名を指定します。このカラムはtext[]型のカラムです。

querytext型の値です。クエリー構文を使っているクエリーです。

pgroonga_query_expandtext型の値を返します。query中にある登録済みの同義語がすべて展開されています。

次のようにpgroonga_text_term_search_ops_v2演算子クラス指定のPGroongaで${table_name}.${term_column_name}のインデックスを作成することをオススメします。これは高速にクエリー展開できるようにするためです。

CREATE TABLE synonyms (
  term text,
  synonyms text[]
);

CREATE INDEX synonyms_term
          ON synonyms
       USING pgroonga (term pgroonga_text_term_search_ops_v2);

pgroonga_query_escape関数はインデックスなしでも動きますが、インデックスがあるとより高速に動きます。

btreeのようにtext型の=に対応しているインデックスアクセスメソッドであればどのインデックスアクセスメソッドでも使えます。しかし、PGroongaを使うことをオススメします。なぜなら、PGroongaはtextの値を正規化した=(大文字小文字を無視した比較を含む)に対応しているからです。クエリー展開時は値を正規化した=が有用です。

使い方

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

CREATE TABLE synonyms (
  term text,
  synonyms text[]
);

CREATE INDEX synonyms_term
          ON synonyms
       USING pgroonga (term pgroonga_text_term_search_ops_v2);

INSERT INTO synonyms VALUES ('PGroonga', ARRAY['PGroonga', 'Groonga PostgreSQL']);

このサンプルではPGroongaインデックスを使っているのでクエリー中の"PGroonga""pgroonga"もすべて展開されます。

SELECT pgroonga_query_expand('synonyms', 'term', 'synonyms',
                             'PGroonga OR Mroonga') AS query_expand;
--                  query_expand                   
-- -------------------------------------------------
--  ((PGroonga) OR (Groonga PostgreSQL)) OR Mroonga
-- (1 row)
SELECT pgroonga_query_expand('synonyms', 'term', 'synonyms',
                             'pgroonga OR mroonga') AS query_expand;
--                   query_expand                   
-- -------------------------------------------------
--  ((PGroonga) OR (Groonga PostgreSQL)) OR mroonga
-- (1 row)

参考