【问题标题】:Prefix/wildcard searches with 'websearch_to_tsquery' in PostgreSQL Full Text Search?在 PostgreSQL 全文搜索中使用“websearch_to_tsquery”进行前缀/通配符搜索?
【发布时间】:2020-10-05 01:13:08
【问题描述】:

我目前正在使用 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:* 无效。

我浏览了文档和许多文章,但找不到很多相关信息。我以前没有使用过它,所以希望这只是我做错了一些简单的事情?

【问题讨论】:

  • 我正在寻找相同的解决方案。这里有什么新结果吗?
  • @Kostanos 我最终只使用了 Elasticsearch,但很想知道是否有使用 PostgreSQL 的干净方法。

标签: postgresql full-text-search


【解决方案1】:

websearch_to_tsquery 无法做到这一点,但您可以使用 to_tsquery 做到这一点(因为 ts_query 允许添加 :* 通配符)并在后端自行添加 websearch 语法。

例如,在 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)

然后在你的 SQL 中使用它

search_column @@ to_tsquery('english', ${escapedSearch})

【讨论】:

    【解决方案2】:

    如果要使用部分匹配,则需要直接编写 tsquery。 plainto_tsquery 也不通过部分匹配表示法,那么在切换到 websearch_to_tsquery 之前你在做什么?

    任何应用词干分析器的东西都很难处理部分匹配。它应该做什么,去掉符号,停止部分,然后重新添加它?不对整个字符串进行词干处理?不只对包含部分匹配指示符的标记进行词干处理吗?它怎么会知道部分匹配是有意的,而不仅仅是另一个标点符号?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-23
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多