我有一个查询:
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个结果”。
有没有办法写这个?谢谢。
答案 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