首页 > 解决方案 > Postgres pg_trgm如何比较字符串数组的相似性

问题描述

我正在尝试pg_trgm用于字符串模糊匹配,我知道它可以这样使用:

SELECT * FROM artists WHERE SIMILARITY(name, 'Claud Monay') > 0.4;

其中标量值可用于与相似度进行比较。但是,我已经看到了这种SIMILARITY与字符串数组一起使用的方式:

SELECT * FROM artists WHERE 'Cadinsky' % ANY(STRING_TO_ARRAY(name, ' '));

它使用%运算符,它是与 . 的默认值进行比较的简写0.3。我正在尝试找到要使用的正确语法,ANY(STRING_TO_ARRAY(...))但使用第一种形式,可以给出任意标量值来比较相似性。

这很可能只是正确使用 for 语法的一个简单问题ANY,但我无法理解正确的形式是什么。

标签: sqlpostgresqlfuzzy-search

解决方案


没有使用带有 3 个参数(字符串、字符串数组和相似度阈值)的 ANY 的语法。这样做的方法是将 pg_trgm.similarity_threshold 设置为您想要的值而不是默认值 0.3,然后使用% ANY.

如果您想在查询的不同部分使用不同的阈值,那么 ANY 构造就不走运了。

您始终可以定义自己的函数,但您可能无法让它使用索引。

create or replace function most_similar(text, text[]) returns double precision 
language sql as $$ 
    select max(similarity($1,x)) from unnest($2) f(x) 
$$;

SELECT * FROM artists WHERE most_similar('Cadinsky', STRING_TO_ARRAY(name, ' '))>0.4;

推荐阅读