これはPGroonga 2.0.0以降用のドキュメントです。PGroonga 1.Xを使っているならPGroonga 1.Xのドキュメントを見てください。
pgroonga_query_extract_keywords関数1.0.7で追加。
pgroonga_query_extract_keywords関数はクエリー構文を使っているテキストからキーワードを抽出します。クエリー構文は&@~演算子や&@~|演算子などで使われています。
クエリーからキーワードを抽出できるとpgroonga_snippet_html関数やpgroonga_highlight_html関数などを使いやすくなります。これらにはキーワードを引数として渡さなければいけません。通常、渡すキーワードはクエリー内のキーワードになります。
この関数の構文は次の通りです。
text[] pgroonga_query_extract_keywords(query, index_name DEFAULTS '')
queryはクエリー構文を使っているtext型の値です。
index_nameはtext型の値です。該当クエリーを使っているインデックスがquery_allow_column=trueを使っている場合はそのインデックスの名前を指定しなければいけません。
index_nameは3.0.0から使えます。
pgroonga_query_extract_keywordsはキーワードの配列を返します。
AND条件とOR条件の検索語はキーワードになります。NOT条件の検索語はキーワードになりません。たとえば、"A (B OR C) - D"ではAとBとCはキーワードでDはキーワードではありません。-はNOT演算子です。
ANDのみの場合はすべての語がキーワードになります。
SELECT pgroonga_query_extract_keywords('Groonga PostgreSQL') AS query_extract_keywords;
--  query_extract_keywords 
-- ------------------------
--  {PostgreSQL,Groonga}
-- (1 row)
ORのみの場合はすべての語がキーワードになります。
SELECT pgroonga_query_extract_keywords('Groonga OR PostgreSQL') AS query_extract_keywords;
--  query_extract_keywords 
-- ------------------------
--  {PostgreSQL,Groonga}
-- (1 row)
カッコを使えます。
SELECT pgroonga_query_extract_keywords('Groonga (MySQL OR PostgreSQL)') AS query_extract_keywords;
--    query_extract_keywords   
-- ----------------------------
--  {Groonga,PostgreSQL,MySQL}
-- (1 row)
NOT条件の語はキーワードになりません。
SELECT pgroonga_query_extract_keywords('Groonga - MySQL PostgreSQL') AS query_extract_keywords;
--  query_extract_keywords 
-- ------------------------
--  {PostgreSQL,Groonga}
-- (1 row)
query_allow_column=trueを使っている場合はindex_nameを指定しなければいけません。
CREATE TABLE memos (
  title text,
  content text
);
CREATE INDEX pgroonga_memo_texts_index
          ON memos
       USING pgroonga (title, content)
        WITH (query_allow_column=true);
SELECT pgroonga_query_extract_keywords(
         'Groonga content:@PostgreSQL',
         index_name => 'pgroonga_memo_texts_index') AS keywords;
--  query_extract_keywords 
-- ------------------------
--  {PostgreSQL,Groonga}
-- (1 row)