Pgroongaで異なる漢字検索
PGroongaを使うと読み方が一緒でも漢字が異なる文字を簡単に検索出来るようになります👍
サンプルSQL
やり方のサンプルSQLを下記に載せます:
-- 必要な拡張機能追加
CREATE EXTENSION IF NOT EXISTS pgroonga;
-- 同じ読みに使われる文字を登録するテーブルを作ります
CREATE TABLE synonyms (
target text,
normalized text
);
-- 検索用インデックスと異なる漢字の辞書データを作ります
CREATE INDEX pgroonga_synonyms_index ON synonyms
USING pgroonga (target pgroonga_text_term_search_ops_v2)
INCLUDE (normalized);
INSERT INTO synonyms VALUES ('齊', '斉');
INSERT INTO synonyms VALUES ('斎', '斉');
INSERT INTO synonyms VALUES ('齋', '斉');
INSERT INTO synonyms VALUES ('髙', '高');
-- 検索を実行させたいサンプルテーブルを作成
-- WITHで指定しているインデックスのnormalizedのところが肝です
CREATE TABLE names (
name text
);
CREATE INDEX pgroonga_names_index
ON names
USING pgroonga (name pgroonga_text_full_text_search_ops_v2)
WITH (normalizers='
NormalizerNFKC150,
NormalizerTable(
"normalized", "${table:pgroonga_synonyms_index}.normalized",
"target", "target"
)
');
INSERT INTO names
(name)
VALUES ('斉藤さん'),('齊藤さん'),('斎藤さん'),('鈴木さん'),('田中さん'),('佐藤さん'),('高橋さん'),('髙橋さん');
-- 斉藤で検索、どの斉藤もヒットする
SELECT name AS synonym_names from names where name &@~ '斉藤さん';
-- synonym_names
-- ---------------
-- 斉藤さん
-- 齊藤さん
-- 斎藤さん
-- (3 rows)
-- 同じく今度は高橋で検索している例、同じく全ての高橋がヒット
SELECT name AS synonym_names from names where name &@~ '高橋さん';
-- synonym_names
-- ---------------
-- 高橋さん
-- 髙橋さん
-- (2 rows)
日本語難しい🫠
他の漢字とか
「渡辺」とか「沢田」みたいなのに対応させる時はこんな感じでデータを入れておきます
INSERT INTO synonyms VALUES ('邉', '辺');
INSERT INTO synonyms VALUES ('邊', '辺');
INSERT INTO synonyms VALUES ('澤', '沢');