PostgreSQL 全文搜索

PostgreSQL Full Text search

我需要在 Postgresql 中使用全文搜索,但我找不到从 table(使用 ts_query)中针对索引文本字段( ts_vector 数据类型)。 ts_query 只能处理几个单词还是也可以处理来自 table 的多个值?

在此先感谢您的帮助。

让我尝试根据对问题给出的评论来制定一个答案(如果我理解你的要求)。

问题

您正在尝试根据存储为 [的单词对 table tableAindexed_text_fieldtsvector 类型)进行全文搜索=16=] 在另一个 table 中 tableB 在名为 words.

的列中

解决方案

首先,如果您希望在全文搜索期间向 PostgreSQL 提供多个标记(单个单词),您可以使用两个函数:

  • to_tsquery()
  • 普通to_tsquery()

在第一个函数中,您需要用与号 (&) 拆分每个给定的标记。第二个函数可以输入任何文本字符串,它会为您将其切成标记。更多信息 here.

您的挑战是您希望 select 根据另一个 table 中出现的词进行匹配。这可以通过不同的方式完成,例如通过简单的 (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() 函数的用法创建表达式索引。