PostgreSQL全文搜索

时间:2015-10-25 20:13:13

标签: postgresql full-text-search

我需要使用Postgresql进行全文搜索,但我找不到从表格(使用ts_query)查找索引文本字段({{1})的单词列表的方法} 数据类型)。 ts_vector只能处理几个单词,还是可以处理来自表格的多个值?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

让我尝试根据问题的评论(如果我理解你的要求正确)来制定答案。

问题

您正尝试在tableA,列indexed_text_fieldtsvector类型)上根据在另一个中存储为text的字词进行全文搜索表tableB中的表words

解决方案

首先,如果您希望在全文搜索期间提供PostgreSQL多个令牌(单个单词),您可以使用两种功能:

  • to_tsquery()
  • plainto_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()函数的使用创建表达式索引。