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

pgroonga.match_positions_character関数

1.1.1で追加。

概要

pgroonga.match_positions_character関数は指定したテキスト中にある指定したキーワードの位置を返します。単位は文字です。HTML出力用にキーワードをハイライトしたいならpgroonga.snippet_html関数またはpgroonga.highlight_html関数の方が適しているでしょう。pgroonga.match_positions_character関数は高度な用途向けです。

バイト単位バージョンが欲しい場合は代わりにpgroonga.match_positions_byteを参照してください。

構文

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

integer[2][] pgroonga.match_positions_character(target, ARRAY[keyword1, keyword2, ...])

targetはキーワード検索対象のテキストです。型はtextです。

keyword1keyword2...は見つけたいキーワードです。型はtextの配列です。1つ以上のキーワードを指定しなければいけません。

pgroonga.match_positions_character returns an array of positions.

位置は「オフセット」と「長さ」で表現します。「オフセット」は先頭からキーワードが現れた位置までの文字数です。「長さ」はマッチしたテキストの文字数です。「長さ」はキーワードの長さと違うかもしれません。これはキーワードもマッチしたテキストも正規化されるからです。

使い方

少なくとも1つキーワードを指定しなければいけません。

SELECT pgroonga.match_positions_character('PGroonga is a PostgreSQL extension.',
                                          ARRAY['PostgreSQL']);
--  match_positions_character 
-- ---------------------------
--  {{14,10}}
-- (1 row)

複数のキーワードを指定できます。

SELECT pgroonga.match_positions_character('PGroonga is a PostgreSQL extension.',
                                          ARRAY['Groonga', 'PostgreSQL']);
--  match_positions_character 
-- ---------------------------
--  {{1,7},{14,10}}
-- (1 row)

pgroonga.query_extract_keywords関数を使うとクエリーからキーワードを抽出できます。

SELECT pgroonga.match_positions_character('PGroonga is a PostgreSQL extension.',
                                          pgroonga.query_extract_keywords('Groonga PostgreSQL -extension'));
--  match_positions_character 
-- ---------------------------
--  {{1,7},{14,10}}
-- (1 row)

文字は正規化されます。

SELECT pgroonga.match_positions_character('PGroonga + pglogical = replicatable!',
                                          ARRAY['Pg']);
--  match_positions_character 
-- ---------------------------
--  {{0,2},{11,2}}
-- (1 row)

マルチバイト文字にも対応しています。

SELECT pgroonga.match_positions_character('10㌖先にある100キログラムの米',
                                     ARRAY['キロ']);
--  match_positions_character 
-- ---------------------------
--  {{2,1},{10,2}}
-- (1 row)

参考