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

オートコンプリート機能の実装方法

オートコンプリートは使いやすい検索ボックスを作るのに便利な機能です。PGroongaにはオートコンプリートを実装するための機能があります。

次の検索を組み合わせることでオートコンプリートを実現できます。

サンプルスキーマとインデックス

サンプルのスキーマを示します。

CREATE TABLE terms (
  term text,
  readings text[]
);

オートコンプリート候補の用語はtermに保存します。termのヨミガナはreadingsに保存します。readingsの型がtext[]であることからわかるように、readingsには複数のヨミガナを保存できます。

サンプルのインデックス定義を示します。

CREATE INDEX pgroonga_terms_prefix_search ON terms USING pgroonga
  (readings pgroonga_text_array_term_search_ops_v2);

CREATE INDEX pgroonga_terms_full_text_search ON terms USING pgroonga
  (term)
  WITH (tokenizer = 'TokenBigramSplitSymbolAlphaDigit');

上記のインデックス定義は前方一致RK検索と全文検索に必要です。

TokenBigramSplitSymbolAlphaDigitトークナイザーは緩い全文検索に向いています。

日本語のみ:ヨミガナでのオートコンプリート用に前方一致RK検索

前方一致RK検索は前方一致検索の一種です。これはローマ字ひらがなまたはカタカナでカタカナを検索できます。日本語にはとても便利な機能です。

前方一致RK検索のためのサンプルデータを示します。

INSERT INTO terms (term, readings) VALUES ('牛乳', ARRAY['ギュウニュウ', 'ミルク']);

readingsにはカタカナのみ追加することに注意してください。これは前方一致RK検索を使ってオートコンプリート候補の用語を検索するのに必要です。

readingsに対して前方一致RK検索をするために&^~演算子を使います。前方一致RK検索の例をいくつか示します。

前方一致RK検索では「gyu」(ローマ字)で「牛乳」をオートコンプリート候補の用語として検索できます。

SELECT term FROM terms WHERE readings &^~ 'gyu';
--  term 
-- ------
--  牛乳
-- (1 row)

前方一致RK検索では「ぎゅう」(ひらがな)で「牛乳」をオートコンプリート候補として検索できます。

SELECT term FROM terms WHERE readings &^~ 'ぎゅう';
--  term 
-- ------
--  牛乳
-- (1 row)

前方一致RK検索では「ギュウ」(カタカナ)で「牛乳」をオートコンプリート候補の用語として検索できます。

SELECT term FROM terms WHERE readings &^~ 'ギュウ';
--  term 
-- ------
--  牛乳
-- (1 row)

より高度なreadingsの使い方があります。同義語の読みをreadingsに入れると、それを使ってオートコンプリート候補の用語を検索することもできます。

SELECT term FROM terms WHERE readings &^~ 'mi';
--  term 
-- ------
--  牛乳
-- (1 row)

「ミルク」は「牛乳」の同義語です。ヨミガナとして「ミルク」をreadingsに追加することで、「mi」で検索したときも「牛乳」をオートコンプリート候補の用語として検索できます。

緩い全文検索

緩い全文検索をするためにtermに対して&@を使います。結果は次の通りです。

INSERT INTO terms (term, readings) VALUES ('auto-complete', ARRAY['オートコンプリート']);
SELECT term FROM terms WHERE term &@ 'mpl';
--      term      
-- ---------------
--  auto-complete
-- (1 rows)

オートコンプリート候補の用語としてauto-completeがヒットしています。