我想在postgresql中实现全文搜索并结合一种模糊搜索。对于我的测试区,我跟进了这篇文章:https://blog.lateral.io/2015/05/full-text-search-in-milliseconds-with-postgresql/ 一切都很好。但是有时我会在searach字符串中搜索带有和没有空格的搜索案例,如下所示:
在我的“标题”列中有一个类似“ test123 ”的条目。我的搜索字符串看起来像“测试123 ”,其中包含空格。 我怎样才能在这个测试用例中获得成功?
我的search-sql-query看起来像:
SELECT *
FROM test, plainto_tsquery('test:*&123:*') as q
WHERE (tsv @@ q)
result: 0 rows
所以我试着弄清楚我是否可以将pg_trgm与ts_vector结合使用,但我找不到解决方案。你有什么想法吗?
答案 0 :(得分:2)
... plainto_tsquery无法识别tsquery运算符,权重 标签或其输入中的前缀匹配标签...
这是因为plainto_tsquery
和phraseto_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'))
这将返回字符串testing:* & 123:*
,然后您可以将其直接与to_tsquery
一起使用以获得完整的归一化模糊匹配。还要为每个行生成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, query
WHERE (test.tsv @@ search.query)