文本搜索的额外功能
Apache Cloudberry 提供了额外的函数和操作符,用于操作搜索向量和查询向量,并可重写搜索查询。
本节包含以下子主题:
操作文档
解析文档介绍了如何将原始文本文档转换为 tsvector
值。Apache Cloudberry 还提供了一些函数和操作符,用于处理已经转换为 tsvector
形式的文档。
tsvector || tsvector
:tsvector
拼接操作符会返回一个新的向量,其中包含两个输入向量的词元和位置信息。拼接时会保留位置和权重标记。右侧向量中的位置值会在拼接时加上左侧向量中最大的位置值,使结果几乎等同于将原始文本拼接后再执行 to_tsvector
的效果。(这种方式并不完全等效,因为如果左侧向量文本结尾处存在被移除的停用词,它不会影响拼接后的结果;但如果直接拼接文本后再转换,则会 影响右侧词元的位置。)
使用向量拼接而非文本拼接的好处之一是可以对文档的不同部分使用不同的解析配置。此外,由于 setweight
函数会统一标记整个向量中的词元权重,因此如果你希望文档的不同部分使用不同权重,应先解析文本并设置权重,再进行拼接。
setweight(<vector> tsvector, <weight> "char") returns tsvector
:setweight
返回输入向量的副本,其中每个位置都被标记为指定的 <weight>
,可选值为 A
、B
、C
或 D
。(新向量默认使用 D
权重,因此不会在输出中显示。)这些权重标记在向量拼接时会保留,从而使排名函数能根据文档不同部分的词汇赋予不同重要性。
请注意,权重是应用在 位置 上,而不是 词元 上。如果输入向量已经被去除位置信息,则 setweight
不会起作用。
length(<vector> tsvector) returns integer
:返回向量中包含的词元数量。
strip(vector tsvector) returns tsvector
:返回一个不带任何位置或权重信息的向量,但其词元与输入向量相同。结果通常比原始向量更小,但也不如原始向量有用。相关性排序在被去除信息的向量上效果较差。此外,<->
(紧跟)操作符无法在这类向量中使用,因为它无法判断词元之间的距离。
完整的 tsvector
相关函数列表可参考 PostgreSQL 文档中的 文本搜索函数与操作符。