postgresql “similarity()”查询分数对于几乎匹配的搜索文本来说相当低

bfhwhh0e  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(1)|浏览(374)
select similarity('GTudH', 'tud'),
       similarity('GTudH', 'gtu'),
       similarity('GTudH', 'gdh')

上面是Postgres的查询结果。有人能解释一下为什么第一个相似度得分只有0.1,而第三个是0.25吗?
用snowflake数据库进行了相同的测试,看起来不错:
| JAROWINKLER_SIMILARITY('GTUDH','TUD')|JAROWINKLER_SIMILARITY('GTUDH','GTU')|JAROWINKLER_SIMILARITY('GTUDH','GDH')|
| - -----|- -----|- -----|
| 八十六|九十|五十一|

jmo0nnb3

jmo0nnb31#

这是因为功能不同。PostgreSQL的similarity()函数是pg_trgm扩展的一部分,它基于“三元组”(trigram)--单词中出现的三个字母的序列--计算相似度。虽然实际的算法略有不同(见源代码),但如果两个单词共享许多三元组,则认为它们相似。
让我们看看GTudH的三元组:

SELECT show_trgm('GTudH');

            show_trgm            
═════════════════════════════════
 {"  g"," gt","dh ",gtu,tud,udh}
(1 row)

pg_trgm前加两个空格,后加一个空格,因为单词开头的相似性被认为更重要。
因此,GTudHtud共享一个三元组,与gtu共享三个三元组,与gdh共享两个三元组,这解释了不同的结果。
“相似性”不是一个明确的概念,有许多不同的方法来定义它。

相关问题