これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
オートコンプリートは使いやすい検索ボックスを作るのに便利な機能です。PGroongaにはオートコンプリートを実装するための機能があります。
次の検索を組み合わせることでオートコンプリートを実現できます。
日本語のみ:ヨミガナでのオートコンプリート用に前方一致RK検索
緩い全文検索
サンプルのスキーマを示します。
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検索のためのサンプルデータを示します。
INSERT INTO terms (term, readings) VALUES ('牛乳', ARRAY['ギュウニュウ', 'ミルク']);
readings
にはカタカナのみ追加することに注意してください。これは前方一致RK検索を使ってオートコンプリート候補の用語を検索するのに必要です。
readings
に対して前方一致RK検索をするために&^~
演算子を使います。前方一致RK検索の例をいくつか示します。
ローマ字を使った前方一致RK検索
ひらがなを使った前方一致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
がヒットしています。