全文搜索类型
tsvector 和 tsquery 类型不能是 Greenplum 数据库表的分布键的一部分。
Parent topic: Greenplum 数据库数据类型
一个 tsvector 值是不同 词素(lexemes) 的排序列表, 也就是由对不同形式的词进行合并,已经被 标准化 的单词组成的列表 (更多细节,请参考 )。 排序和去重在输入过程中已经自动完成。请看以下例子:
要表示包含空格和标点符号的词素,可以用单引号把它们包围起来:
tsvector
-------------------------------------------
' ' 'contains' 'lexeme' 'spaces' 'the'
(在这个例子中,我们使用了 $$ 引起来的字符串字面值。下一个例子中,我们使用常规的单引号引起来的字符串,所以字面值中嵌入的单引号必须双写进行转义。) 单引号引起来的词素中嵌入的单引号(‘)和反斜杠(\)必须双写:
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
tsvector
------------------------------------------------
'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
tsvector
-------------------------------------------------------------------------------
'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4
一个定位数值通常表示源单词在文档中的位置。定位信息能够在 邻近排名 时使用。 定位数值的范围可以从 1 到 16383; 更大的数值自动归整到 16383。 相同定位数值的同一词素会被丢弃。
包含定位数值的词素可以进一步使用一个 权重 进行标记, 权重可以是 A, B, C, 或 D 。 D 是默认权重因此在输出中不会显示:
典型地,权重被用来反映文档结构, 例如, 可以使用不同权重标记标题与正文中的单词。全文搜索排名函数能够对不同权重标记指派不同优先级。
理解 tsvector 类型本身并不进行任何标准化非常重要; 它假定给它的单词已经为应用进行了适当地标准化。例如,
select 'The Fat Rats'::tsvector;
tsvector
'Fat' 'Rats' 'The'
对大多数英文全文搜索应用,上面的单词被认为是非标准化的,但是 tsvector 并不在意。原始文档文本应该总是通过 to_tsvector 函数来为搜索进行适当地标准化:
to_tsvector
-----------------
'fat':2 'rat':3
tsquery
SELECT 'fat & rat'::tsquery;
tsquery
---------------
'fat' & 'rat'
SELECT 'fat & (rat | cat)'::tsquery;
tsquery
---------------------------
'fat' & ( 'rat' | 'cat' )
SELECT 'fat & rat & ! cat'::tsquery;
'fat' & 'rat' & !'cat'
不使用括号时, ! (非) 具有最高优先级, 另外 & (与) 优先级高于 | (或)。
可选地, 一个 tsquery 中的词素可以带一个或多个权重标记字母,用来限制他们只与合适权重的 tsvector 相匹配:
Also, 一个 tsquery 中的词素也可以用星号(*)指定前缀匹配:
SELECT 'super:*'::tsquery;
tsquery
-----------
'super':*
这个查询会匹配一个以 “super” 开头的 tsvector 中的任何单词。 注意前缀会被全文搜索配置首先处理,也就是说这个比较会返回 true (真):
SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' );
?column?
----------
t
(1 row)
因为 postgres 中提取的词干是 postgr :
SELECT to_tsquery('postgres:*');
to_tsquery
------------
'postgr':*
(1 row)
词素引用规则与前面 tsvector 中的规则一样; 同时,也和 tsvector 一样, 任何需要标准化的单词必须在转换为 tsquery 类型之前完成。 to_tsquery 函数可以方便地用来进行这类标准化操作: