pg_trgmのsimilarity関数
ntext型の近似検索用に自作で文字列間の類似度を評価する関数(pg_similar_rate)を作成していたけど、pg_trgm EXTENSIONにも似たような機能の関数(similarity)があるので比較してみた。
foo=# SELECT similarity('フィロストラトス' ,'ほげほげほげ'); similarity ------------ 0 (1 row) foo=# SELECT pg_similar_rate('フィロストラトス' ,'ほげほげほげ'); pg_similar_rate ----------------- 0 (1 row) foo=# SELECT similarity('フィロストラトス' ,'フィロストラトス'); similarity ------------ 1 (1 row) foo=# SELECT pg_similar_rate('フィロストラトス' ,'フィロストラトス'); pg_similar_rate ----------------- 1 (1 row)
まったく一致しない場合は0、完全に一致する場合には1を返却するのは同じようだ。
foo=# SELECT similarity('フィロストラトス' ,'フロストラトス'); similarity ------------ 0.545455 (1 row) foo=# SELECT pg_similar_rate('フィロストラトス' ,'フロストラトス'); pg_similar_rate ----------------- 0.78125 (1 row) foo=#
微妙に違う場合の値は当然違う。
とはいえ、similarity()の挙動をもう少しきちんと調べて、類似度のレートの傾向が分かれば自作の関数ではなく、こっちを使うという手もあるか。ただ、pg_trgmがntext EXTENSIONの依存EXTENSIONになってしまうので、それはそれで考えものではあるが・・・