首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres pg_trgm如何比较字符串数组的相似性

Postgres pg_trgm如何比较字符串数组的相似性
EN

Stack Overflow用户
提问于 2021-02-13 03:56:11
回答 2查看 307关注 0票数 0

我正在尝试使用pg_trgm进行字符串模糊匹配,我知道它可能是这样使用的:

代码语言:javascript
复制
SELECT * FROM artists WHERE SIMILARITY(name, 'Claud Monay') > 0.4;

其中标量值可用于与相似性进行比较。但是,我见过将SIMILARITY与字符串数组一起使用的这种方式:

代码语言:javascript
复制
SELECT * FROM artists WHERE 'Cadinsky' % ANY(STRING_TO_ARRAY(name, ' '));

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

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

EN

回答 2

Stack Overflow用户

发布于 2021-02-13 05:06:15

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

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

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

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2021-06-29 16:18:07

我不是一个数据库专家,也不擅长SQL,但这是我的解决方案。

我基本上使用了一个名为unnest()的函数。因此,我可以遍历数组并检查每个项目的相似度值,然后将其与相似度输入进行比较,后者是一个浮点数。

据我所知,使用像set pg_trgm.similarity_threshold=0.6;这样的东西是一种全球性的设置。这个问题特别要求一个显式阈值

此外,如果您创建了一个函数来执行此工作,并且该函数不是VOLATILE而是STABLE,则不能使用 set pg_trgm.similarity_threshold。(至少在我身上是这样的)。

警告:我没有将我的方法与(任何)方法在性能方面进行比较。

示例代码:

代码语言:javascript
复制
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 $
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66178283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档