これはPGroonga 1.X用のドキュメントです。新しいPGroongaを使っているならPGroonga 2.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_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)