Postgresql 如何在文本中查询一系列单词,但不一定是紧跟其后的单词

Postgresql 如何在文本中查询一系列单词,但不一定是紧跟其后的单词,postgresql,full-text-search,postgresql-11,Postgresql,Full Text Search,Postgresql 11,有没有办法对一系列单词进行全文搜索?顺序很重要,但单词之间的距离并不重要。这些单词可以相邻,也可以相隔n个单词 例如,给定以下文本:敏捷的棕色狐狸跳过懒惰的狗 以下搜索应返回true:quick brown、quick jumps、jumps dog 但以下内容应返回错误:棕色快速,跳狐狸,跳棕色 仅当两个单词正好是一个接一个时,运算符才会返回true。其中n>0仅当第二个字与第一个字的距离正好为n时才会返回true 我想到的解决方案是使用&运算符,然后使用“%firstword%secondw

有没有办法对一系列单词进行全文搜索?顺序很重要,但单词之间的距离并不重要。这些单词可以相邻,也可以相隔n个单词

例如,给定以下文本:敏捷的棕色狐狸跳过懒惰的狗

以下搜索应返回true:quick brown、quick jumps、jumps dog

但以下内容应返回错误:棕色快速,跳狐狸,跳棕色

仅当两个单词正好是一个接一个时,运算符才会返回true。其中n>0仅当第二个字与第一个字的距离正好为n时才会返回true

我想到的解决方案是使用&运算符,然后使用“%firstword%secondword%”进行额外筛选,但如果有许多文档,并且表中有100.000多个文档,则这会很慢


Postgres中有什么快速的方法可以做到这一点吗?

您可以在这里使用正则表达式:

WITH yourTable AS (
    SELECT 'The quick brown fox jumps over the lazy dog'::text AS input
)

SELECT input
FROM yourTable
WHERE input ~* '.*\yquick\y.*\yjumps\y.*';
此处使用的正则表达式用于检测输入中作为单独单词的快速和跳跃,其顺序如下:

.*\bquick\b.*\bjumps\b.*

这不是很慢吗?可能有数千条记录需要检查。@ConstantingAlbernu是的,正则表达式不一定是最快的方法。如果你需要最好的性能,那就考虑使用全文搜索。它可以通过pg_trgm索引来加速。但这是缓慢的,然后让它更快。你还没有给我们信息来帮助你这么做。看,十万不是那么多。有多少文档将包含“jumps&fox”,但由于排序而失败?@jjanes我不确定,这取决于搜索的术语。我一直在想为什么Postgres没有这样一个操作符,尤其是它在ts_rank_cd函数中使用了术语之间的距离。我希望这些单词的顺序是这样的,即使一个在第3章,一个在第27章,对我来说似乎不是一个很有意义的操作符。如果我们开始添加这样的内容,我们将在哪里停止?如果我们将它用于GIN,它仍然会提取所有包含这两个单词的文档,稍后会重新检查词序,因此它的性能与自己重新检查差不多,尽管语法更好。不过,也许您可以在RUM中添加这样一个操作符,因为它在索引中存储订单信息。