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

gmol1639  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(4)|浏览(250)

我目前正在使用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:**无效。
我已经浏览了文档和一些文章,但我找不到很多信息。我以前没有用过它,所以希望它只是一些简单的,我做错了?

xiozqbni

xiozqbni1#

我提出的另一个解决方案是将文本转换作为查询的一部分,因此构建tsquery的过程如下所示

to_tsquery(concat(regexp_replace(trim('  all the search terms here  '), '\W+', ':* & '), ':*'));
  • trim)删除前导/尾随空格
  • regexp_replace)将搜索字符串拆分为非单词字符,并在每个术语后添加通配符,然后对术语进行AND运算(:* &
  • concat)在最后一个搜索词后添加尾随通配符
  • to_tsquery)转换为ts_query

您可以通过运行以下命令来测试字符串操作

SELECT concat(regexp_replace(trim('  all the search terms here  '), '\W+', ':* & ', 'gm'), ':*')

结果应该是

all:* & the:* & search:* & terms:* & here:*

因此,您有多个单词部分匹配,例如,搜索spi ma将返回与spider man匹配的结果

rekjcdws

rekjcdws2#

为了在其他好答案的基础上添加一些内容,您还可以使用websearch_to_tsqueryto_tsquery来编写查询,以获得来自两个领域的所有内容:

select * from your_table where ts_vector_col @@ to_tsquery('simple', websearch_to_tsquery('simple', 'partial query')::text || ':*')
fdbelqdn

fdbelqdn3#

如果要使用部分匹配,则需要直接编写tsquery。plainto_tsquery也不通过部分匹配表示法,那么在切换到websearch_to_tsquery之前,您在做什么?
任何应用词干分析器的东西都很难处理部分匹配。它应该怎么做,去掉符号,把部分词干化,然后再把它加回去?不对整个字符串做词干化?不对包含部分匹配指示符的标记做词干化?它怎么知道部分匹配是有意的,而不是仅仅是另一段标点符号?

相关问题