PostgreSQL全文搜索

cygmwpex  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(155)

我需要使用Postgresql的全文搜索,但我找不到从表中查找单词列表的方法(使用ts_query)对索引文本字段(ts_vector数据类型)。ts_query只能处理几个字,还是也可以处理来自一个表的多个值?
先谢谢你的帮助。

knpiaxh1

knpiaxh11#

让我试着根据对这个问题的评论来制定一个答案(如果我正确理解你的要求的话)。

问题

您正在尝试对表tableAindexed_text_field列(tsvector类型)进行全文搜索,搜索的基础是另一个表tableB中名为words的列中存储为text的单词。

解决方案

首先,如果你想在全文搜索中为PostgreSQL提供多个标记(单个单词),你可以使用两个函数:

  • to_tsquery()
  • planto_tsquery()

在第一个函数中,您需要使用&号(&)拆分每个给定的标记。第二个函数可以输入任何文本字符串,它会将其分割成令牌。更多信息here .
您的挑战是希望根据另一个表中存在的单词选择匹配项。这可以通过不同的方式来完成,例如通过简单的(INNER)JOIN:

SELECT a.* FROM tableA a, tableB b WHERE a.indexed_text_field @@ to_tsquery(b.words);

或者,如果words列中有多个单词,则最有可能使用plainto_tsquery()函数来保持简单:

SELECT a.* FROM tableA a, tableB b WHERE a.indexed_text_field @@ plainto_tsquery(b.words);

然而,如果你必须使用更低级的to_tsquery()版本:

SELECT a.* FROM tableA a, tableB b WHERE a.indexed_text_field @@ to_tsquery(replace(b.words, ' ', '&'));

在后者中,您将单词之间的所有空格替换为&符号,从而使它们成为单独的标记。不过,请注意最后一个函数的索引用法,因为您可能需要为replace()函数的用法创建一个表达式索引。

相关问题