PostgreSQL 全文搜索
PostgreSQL Full Text search
我需要在 Postgresql 中使用全文搜索,但我找不到从 table(使用 ts_query
)中针对索引文本字段( ts_vector
数据类型)。 ts_query
只能处理几个单词还是也可以处理来自 table 的多个值?
在此先感谢您的帮助。
让我尝试根据对问题给出的评论来制定一个答案(如果我理解你的要求)。
问题
您正在尝试根据存储为 [的单词对 table tableA
列 indexed_text_field
(tsvector
类型)进行全文搜索=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()
函数的用法创建表达式索引。
我需要在 Postgresql 中使用全文搜索,但我找不到从 table(使用 ts_query
)中针对索引文本字段( ts_vector
数据类型)。 ts_query
只能处理几个单词还是也可以处理来自 table 的多个值?
在此先感谢您的帮助。
让我尝试根据对问题给出的评论来制定一个答案(如果我理解你的要求)。
问题
您正在尝试根据存储为 [的单词对 table tableA
列 indexed_text_field
(tsvector
类型)进行全文搜索=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()
函数的用法创建表达式索引。