我目前正在使用websearch_to_tsquery函数在PostgreSQL中进行全文搜索。除了我似乎不能再进行部分匹配之外,它运行得很好。
SELECT ts_headline('english', q.\"Content\", websearch_to_tsquery('english', {request.Text}), 'MaxFragments=3,MaxWords=25,MinWords=2') Highlight, *
FROM (
SELECT ts_rank_cd(f.\"SearchVector\", websearch_to_tsquery('english', {request.Text})) AS Rank, *
FROM public.\"FileExtracts\" f, websearch_to_tsquery('english', {request.Text}) as tsq
WHERE f.\"SearchVector\" @@ tsq
ORDER BY rank DESC
) q
搜索 customer 有效,但搜索 *cust**和 *cust:**无效。
我已经浏览了文档和一些文章,但我找不到很多信息。我以前没有用过它,所以希望它只是一些简单的,我做错了?
4条答案
按热度按时间xiozqbni1#
我提出的另一个解决方案是将文本转换作为查询的一部分,因此构建tsquery的过程如下所示
trim
)删除前导/尾随空格regexp_replace
)将搜索字符串拆分为非单词字符,并在每个术语后添加通配符,然后对术语进行AND运算(:* &
)concat
)在最后一个搜索词后添加尾随通配符to_tsquery
)转换为ts_query您可以通过运行以下命令来测试字符串操作
结果应该是
因此,您有多个单词部分匹配,例如,搜索
spi ma
将返回与spider man
匹配的结果rekjcdws2#
为了在其他好答案的基础上添加一些内容,您还可以使用
websearch_to_tsquery
和to_tsquery
来编写查询,以获得来自两个领域的所有内容:fdbelqdn3#
如果要使用部分匹配,则需要直接编写tsquery。
plainto_tsquery
也不通过部分匹配表示法,那么在切换到websearch_to_tsquery之前,您在做什么?任何应用词干分析器的东西都很难处理部分匹配。它应该怎么做,去掉符号,把部分词干化,然后再把它加回去?不对整个字符串做词干化?不对包含部分匹配指示符的标记做词干化?它怎么知道部分匹配是有意的,而不是仅仅是另一段标点符号?