在PostgreSQL全文搜索中使用'websearch_to_tsquery'进行前缀/通配符搜索?

时间:2020-10-05 01:13:08

标签: postgresql full-text-search

我目前正在使用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

搜索客户工作,但 cust *和 cust: *不搜索。

我已经浏览了文档和许多文章,但是找不到很多信息。我以前从未使用过它,所以希望这只是我做错了的简单事情?

2 个答案:

答案 0 :(得分:1)

如果要使用部分匹配,则需要直接编写tsquery。 pm2 start script.js --no-autorestart也没有通过部分匹配表示法,因此在切换到websearch_to_tsquery之前您正在做什么?

任何应用词干分析器的人都很难处理部分比赛。它应该做什么,去掉符号,阻止零件,然后重新添加?不在整个字符串上干吗?不仅仅基于包含部分匹配指示符的令牌吗?而且它怎么会知道部分匹配是有目的的,而不是仅仅只是另外一个标点符号?

答案 1 :(得分:0)

您不能用 websearch_to_tsquery 做到这一点,但您可以用 to_tsquery 做到这一点(因为 ts_query 允许添加 :* 通配符)并自己在后端添加网络搜索语法.

例如在 node.js 环境中,您可以执行 smth。像这样:

let trimmedSearch = req.query.search.trim()
let searchArrays = trimmedSearch.split(/\s+/) //split on every whitespace and remove whitespace
let searchWithStar = searchArray.join(' & ' ) + ':*'  //join word back together adds AND sign in between an star on last word
let escapedSearch = yourEscapeFunction(searchWithStar)

然后在您的 SQL 中使用它

search_column @@ to_tsquery('english', ${escapedSearch})
相关问题