PostgreSQL中的全文搜索与模糊搜索相结合



我想在postgresql中实现全文搜索,并结合一种模糊搜索。对于我的测试区域,我跟进了这篇文章:https://blog.lateral.io/2015/05/full-text-search-in-milliseconds-with-postgresql/一切正常。但有时我在 searach 字符串中有带空格和不带空格的搜索案例,如下所示:

在我的"标题"列中,有一个类似">test123"的条目。我的搜索字符串看起来像">test 123",里面有一个空格。 我怎样才能在这个测试用例中获得成功?

我的搜索SQL查询看起来像:

SELECT * 
FROM test, plainto_tsquery('test:*&123:*') as q 
WHERE (tsv @@ q)
result: 0 rows

所以我试图弄清楚我是否可以将pg_trgm与ts_vector结合使用,但我找不到解决方案。你有想法吗?

正如解析文档所述:

。plainto_tsquery无法识别 tsquery 运算符、权重 标签,或其输入中的前缀匹配标签...

plainto_tsqueryphraseto_tsquery是方便的函数,可以更轻松地按完整字符串进行搜索,但它们不支持所有功能。请改用接受完整搜索语法的to_tsquery

SELECT * 
FROM test, to_tsquery('testing:* & 123:*') as q 
WHERE (tsv @@ q)

此函数还要求您规范化搜索查询,就像使用to_tsvector规范化要搜索的文本一样,但使用某些字符串函数这很容易:

SELECT string_agg(lexeme || ':*', ' & ' order by positions) 
FROM unnest(to_tsvector('testing 123'))

这基本上是从to_tsvector中获取单个令牌,将:*附加到每个令牌,然后将它们与&连接以创建单个字符串。上面的示例采用testing 123并生成testing:* & 123:*然后您可以直接与to_tsquery一起使用,以获得具有完整规范化的模糊匹配。

您可以将所有内容组合到一个 CTE 中,以使其简单:

WITH search AS (
SELECT to_tsquery(string_agg(lexeme || ':*', ' & ' order by positions)) AS query
FROM unnest(to_tsvector('enter your search query here'))
)
SELECT test.*
FROM test, search
WHERE (test.tsv @@ search.query)

这假定表具有数据类型为tsquerytsv列,该列是预先生成的,而不是在每个查询上创建它(这要慢得多)。PG12+支持生成的列,可以自动更新。

在我的博客上更深入的答案:https://manigandham.com/post/fuzzy-fulltext-search-postgresql

最新更新