sql - 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
,但我无法理解正确的形式是什么。
解决方案
没有使用带有 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;
推荐阅读
- swiftui - ButtonStyle 字体跟踪或投射配置标签?
- angular - 如何在 Angular 中传递多个必需的路由?
- node.js - 邮递员表单数据图像请求将图像设置为未定义
- c# - C# - Entity Framework Core - 数据库操作预计会影响 1 行,但实际上影响了 0 行
- python - 字符串在python中用Null替换'Null'
- python - 以pythonic方式更新库存
- oracle - Oracle - 两个列表分区表之间的交换分区
- apache-kafka - offsetForTimes 函数在内部如何工作
- swift - 如何区分xCode(swift)中animationDidStop(Key的值)中的动画
- anylogic - 我们如何将工人(一种资源)移动到桥式起重机小车位置并在桥式起重机开始移动之前抓住它?