我正在尝试使用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语法的简单问题,但我无法理解正确的形式是什么。
发布于 2021-02-13 05:06:15
没有语法可以使用带有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;发布于 2021-06-29 16:18:07
我不是一个数据库专家,也不擅长SQL,但这是我的解决方案。
我基本上使用了一个名为unnest()的函数。因此,我可以遍历数组并检查每个项目的相似度值,然后将其与相似度输入进行比较,后者是一个浮点数。
据我所知,使用像set pg_trgm.similarity_threshold=0.6;这样的东西是一种全球性的设置。这个问题特别要求一个显式阈值。
此外,如果您创建了一个函数来执行此工作,并且该函数不是VOLATILE而是STABLE,则不能使用 set pg_trgm.similarity_threshold。(至少在我身上是这样的)。
警告:我没有将我的方法与(任何)方法在性能方面进行比较。
示例代码:
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 $https://stackoverflow.com/questions/66178283
复制相似问题