Chr*_*ris 9 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
Run Code Online (Sandbox Code Playgroud)
搜索客户工作,但cust * 和cust: * 不搜索。
我浏览了文档和许多文章,但找不到很多相关信息。我以前没有使用过它,所以希望这只是我做错的简单事情?
小智 5
你不能这样做,websearch_to_tsquery但你可以这样做to_tsquery(因为 ts_query 允许添加:*通配符)并在后端自行添加网络搜索语法。
例如,在 Node.js 环境中,您可以执行以下操作。像这样:
let trimmedSearch = req.query.search.trim()
let searchArray = 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)
Run Code Online (Sandbox Code Playgroud)
然后在你的 SQL 中使用它
search_column @@ to_tsquery('english', ${escapedSearch})
Run Code Online (Sandbox Code Playgroud)
如果要使用部分匹配,则需要直接编写tsquery。 plainto_tsquery也不通过部分匹配符号,那么在切换到 websearch_to_tsquery 之前您在做什么?
任何应用词干分析器的东西都将很难处理部分匹配。它应该做什么,去掉符号,阻止该部分,然后再次将其添加回来?不对整个字符串进行词干处理吗?不只对包含部分匹配指示符的标记进行词干提取吗?它怎么知道部分匹配是有意的,而不仅仅是另一个标点符号?