我需要使用Postgresql的全文搜索,但我找不到从表中查找单词列表的方法(使用ts_query)对索引文本字段(ts_vector数据类型)。ts_query只能处理几个字,还是也可以处理来自一个表的多个值?先谢谢你的帮助。
ts_query
ts_vector
knpiaxh11#
让我试着根据对这个问题的评论来制定一个答案(如果我正确理解你的要求的话)。
您正在尝试对表tableA的indexed_text_field列(tsvector类型)进行全文搜索,搜索的基础是另一个表tableB中名为words的列中存储为text的单词。
tableA
indexed_text_field
tsvector
tableB
words
text
首先,如果你想在全文搜索中为PostgreSQL提供多个标记(单个单词),你可以使用两个函数:
在第一个函数中,您需要使用&号(&)拆分每个给定的标记。第二个函数可以输入任何文本字符串,它会将其分割成令牌。更多信息here .您的挑战是希望根据另一个表中存在的单词选择匹配项。这可以通过不同的方式来完成,例如通过简单的(INNER)JOIN:
SELECT a.* FROM tableA a, tableB b WHERE a.indexed_text_field @@ to_tsquery(b.words);
或者,如果words列中有多个单词,则最有可能使用plainto_tsquery()函数来保持简单:
plainto_tsquery()
SELECT a.* FROM tableA a, tableB b WHERE a.indexed_text_field @@ plainto_tsquery(b.words);
然而,如果你必须使用更低级的to_tsquery()版本:
to_tsquery()
SELECT a.* FROM tableA a, tableB b WHERE a.indexed_text_field @@ to_tsquery(replace(b.words, ' ', '&'));
在后者中,您将单词之间的所有空格替换为&符号,从而使它们成为单独的标记。不过,请注意最后一个函数的索引用法,因为您可能需要为replace()函数的用法创建一个表达式索引。
replace()
1条答案
按热度按时间knpiaxh11#
让我试着根据对这个问题的评论来制定一个答案(如果我正确理解你的要求的话)。
问题
您正在尝试对表
tableA
的indexed_text_field
列(tsvector
类型)进行全文搜索,搜索的基础是另一个表tableB
中名为words
的列中存储为text
的单词。解决方案
首先,如果你想在全文搜索中为PostgreSQL提供多个标记(单个单词),你可以使用两个函数:
在第一个函数中,您需要使用&号(&)拆分每个给定的标记。第二个函数可以输入任何文本字符串,它会将其分割成令牌。更多信息here .
您的挑战是希望根据另一个表中存在的单词选择匹配项。这可以通过不同的方式来完成,例如通过简单的(INNER)JOIN:
或者,如果
words
列中有多个单词,则最有可能使用plainto_tsquery()
函数来保持简单:然而,如果你必须使用更低级的
to_tsquery()
版本:在后者中,您将单词之间的所有空格替换为&符号,从而使它们成为单独的标记。不过,请注意最后一个函数的索引用法,因为您可能需要为
replace()
函数的用法创建一个表达式索引。