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になってしまうので、それはそれで考えものではあるが・・・