如何解决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(...))
的正确语法,但使用第一种形式,其中可以给出任意标量值来比较相似性。
这很可能只是一个正确使用 ANY
语法的简单问题,但我无法理解正确的形式是什么。
解决方法
没有语法可以使用带有 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;
,
我不是数据库专家,也不擅长 SQL,但这是我的解决方案。
我基本上使用一个名为 unnest() 的函数。因此,我可以遍历数组并检查每个项目的相似度值,然后将其与 similarity 输入进行比较,这是一个 float。
据我所知,使用 set pg_trgm.similarity_threshold=0.6;
之类的东西是一个全局设置。这个问题特别要求一个明确的阈值。
此外,如果您创建了一个函数来完成这项工作并且该函数不是 VOLATILE
而是 STABLE
,则您不能使用 set pg_trgm.similarity_threshold
。 (至少那是发生在我身上的事情)。
警告:我没有将我的方法与 (ANY) 方法在性能方面进行比较。
示例代码:
CREATE OR REPLACE FUNCTION your_function_name (input text,similarity float) RETURNS
SELECT * FROM your_table_name
WHERE EXISTS
(SELECT
FROM unnest(ARRAY['item','anotherItem','third-ish']) element
WHERE SIMILARITY (input,element) > similarity
);
$ function $
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。