具有ANY子句的Postgres相似运算符-每个参数的限制?

时间:2019-04-04 11:58:05

标签: sql postgresql

我有一个查询:

SELECT 
  word, 
  similarity(word, 'foo') as "similarity"
FROM words
WHERE word ~* 'foo'
ORDER BY similarity DESC
LIMIT 5

在搜索中针对每个单词被调用。例如,搜索“英国牛津大学”将调用此查询3次。

我现在想编写一个查询,该查询在一次数据库访问中可以找到与所有3个单词相似的单词,到目前为止,我有这样的东西:

SELECT set_limit(0.4);
SELECT word
FROM words
WHERE word % ANY(ARRAY['foo', 'bar', 'baz']);

但是,我想不出一种方法,说“给我每个单词5个结果”。

有没有办法写这个?谢谢。

1 个答案:

答案 0 :(得分:2)

使要搜索并加入%条件的单词数组嵌套,而不是在WHERE中应用它,然后为每个搜索单词编号并过滤该数字:

SELECT subq.search_word
     , subq.word
  FROM (SELECT srch.word as search_word
             , wrd.word 
             , ROW_NUMBER() OVER (PARTITION BY srch.word ORDER BY similarity(wrd.word, srch.word) DESC) AS rn
          FROM words wrd
          JOIN UNNEST(ARRAY['foo', 'bar']) as srch(word)
            ON wrd.word % srch.word) subq
 WHERE subq.rn <= 5