最近、個人開発しているサービスに類義語辞書を実装したいなと思ったところ、PGroongaで実現できそうだったので、その方法についてまとめます。
1. PGroongaとは
PGroongaとは、PostgresのExtensionで日本語の全文検索(※)を可能にしてくれます。
全文検索とは、テキスト内の任意の文字列を検索キーワードとして使用できる検索機能です。例えば、"あー。今日もいい天気だな。"というテキストがあった場合、"天気"と検索するとこのテキストがヒットします。
今回は、PGroongaを使って類義語辞書を実装していきます。
2. 今回のゴール
以下の検索が可能になることをゴールとします。
- 同じ意味を持つ単語を検索結果に含める
例えば、「ミルク」と検索した場合に、「牛乳」がヒットする。 - カタカナ、ひらがな、ローマ字の入力に対応
例えば、「gyu」と検索しても「牛乳」がヒットする。
この機能を実現するために、PGroongaの類義語辞書として使える仕組みを構築していきます。
3.実装
今回の実装は、PGroongaの公式サイト通りに進めていきます。
3.1 類義語テーブルの作成
まずは類義語を格納するテーブルを作成します。
このテーブルは、以下の2つのカラムを持ちます。
- term: 検索対象の単語
- readings: 類義語や読み仮名のリスト(配列形式)
CREATE TABLE terms (
term text,
readings text[]
);
3.2 インデックスの作成
次に類義語検索に使用するインデックスを作成します。
CREATE INDEX pgroonga_terms_prefix_search ON terms USING pgroonga
(readings pgroonga_text_array_term_search_ops_v2);
3.3 類義語の登録
さきほど作成したテーブルに類義語を登録します。
INSERT INTO terms (term, readings)
VALUES ('牛乳', ARRAY['ギュウニュウ', 'ミルク']);
これで実装は完了です!
4. 動作確認
今回の同義語を検索する際は以下のようなSELECT文を実行します。
SELECT term FROM terms WHERE readings &^~ '任意の文字';
では、実際にSELECT文で動作確認してみたいと思います。
SELECT term FROM terms WHERE readings &^~ 'ミルク';
term
------
牛乳
(1 row)
"牛乳" の類義語として登録した "ミルク" でヒットしました!
また、他にも以下の検索条件でも同じようにヒットします。
-- ローマ字
SELECT term FROM terms WHERE readings &^~ 'gyuunyuu';
SELECT term FROM terms WHERE readings &^~ 'miruku';
-- 前方一致(ローマ字)
SELECT term FROM terms WHERE readings &^~ 'gyu';
SELECT term FROM terms WHERE readings &^~ 'mi';
-- 前方一致(カタカナ)
SELECT term FROM terms WHERE readings &^~ 'ギュウ';
SELECT term FROM terms WHERE readings &^~ 'ミ';
-- 前方一致(ひらがな)
SELECT term FROM terms WHERE readings &^~ 'ぎゅう';
SELECT term FROM terms WHERE readings &^~ 'み';
5. まとめ
PGroongaを使うことで、類義語辞書を簡単に実装できました。
個人開発やプロジェクトで日本語の検索機能を強化したい場合に、ぜひ参考にしてみてください!