これはPGroonga 1.X用のドキュメントです。新しいPGroongaを使っているならPGroonga 2.xのドキュメントを見てください。
これらはPGroonga 4.0.0で削除されました。PGroonga 4.0.0以降では利用できません。
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_nameはtext型の値です。同義語を格納している既存のテーブルの名前を指定します。
term_column_nameはtext型の値です。table_nameテーブル内の展開対象の単語を格納しているカラムの名前を指定します。このカラムはtext型のカラムです。
synonyms_column_nameはtext型の値です。termカラムの同義語を格納しているカラム名を指定します。このカラムはtext[]型のカラムです。
queryはtext型の値です。クエリー構文を使っているクエリーです。
pgroonga.query_expandはtext型の値を返します。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');
-- query_expand
-- -------------------------------------------------
-- ((PGroonga) OR (Groonga PostgreSQL)) OR Mroonga
-- (1 row)
SELECT pgroonga.query_expand('synonyms', 'term', 'synonyms',
'pgroonga OR mroonga');
-- query_expand
-- -------------------------------------------------
-- ((PGroonga) OR (Groonga PostgreSQL)) OR mroonga
-- (1 row)