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

时间:2017-09-08 17:59:03

标签: sql postgresql full-text-search tsvector pg-trgm

我想在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结合使用,但我找不到解决方案。你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

documentation on parsing指出:

  

... 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'))

这将返回字符串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)