全文搜索类型
全文搜索类型
Greenplum 数据库提供两种数据类型,这两种数据类型被设计来支持全文搜索,即搜索自然语言 文档 集合并定位与一个 查询 最匹配内容。 tsvector 类型以一种专为全文搜索优化的形式表示一个文档; 类似地, tsquery 类型表示一个文本查询。 使用全文搜索 有这方面支持的详细解释, 文本搜索函数和操作符 总结了相关函数和操作。
tsvector 和 tsquery 类型不能是 Greenplum 数据库表的分布键的一部分。
tsvector
一个 tsvector 值是不同 词素(lexemes) 的排序列表, 也就是由对不同形式的词进行合并,已经被 标准化 的单词组成的列表 (更多细节,请参考 使用全文搜索)。 排序和去重在输入过程中已经自动完成。请看以下例子:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector; tsvector ---------------------------------------------------- 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
要表示包含空格和标点符号的词素,可以用单引号把它们包围起来:
SELECT $$the lexeme ' ' contains spaces$$::tsvector; 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 是默认权重因此在输出中不会显示:
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector; tsvector ---------------------------- 'a':1A 'cat':5 'fat':2B,4C
典型地,权重被用来反映文档结构, 例如, 可以使用不同权重标记标题与正文中的单词。全文搜索排名函数能够对不同权重标记指派不同优先级。
理解 tsvector 类型本身并不进行任何标准化非常重要; 它假定给它的单词已经为应用进行了适当地标准化。例如,
select 'The Fat Rats'::tsvector; tsvector -------------------- 'Fat' 'Rats' 'The'
对大多数英文全文搜索应用,上面的单词被认为是非标准化的,但是 tsvector 并不在意。原始文档文本应该总是通过 to_tsvector 函数来为搜索进行适当地标准化:
SELECT to_tsvector('english', 'The Fat Rats'); to_tsvector ----------------- 'fat':2 'rat':3
tsquery
一个 tsquery 值为搜索存储词素,同时结合它们实现布尔操作 & (与), | (或), 以及 ! (非)。 括号可以用来表示分组操作:
SELECT 'fat & rat'::tsquery; tsquery --------------- 'fat' & 'rat' SELECT 'fat & (rat | cat)'::tsquery; tsquery --------------------------- 'fat' & ( 'rat' | 'cat' ) SELECT 'fat & rat & ! cat'::tsquery; tsquery ------------------------ 'fat' & 'rat' & !'cat'
不使用括号时, ! (非) 具有最高优先级, 另外 & (与) 优先级高于 | (或)。
可选地, 一个 tsquery 中的词素可以带一个或多个权重标记字母,用来限制他们只与合适权重的 tsvector 相匹配:
SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat'
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)
所以就匹配到了 postgraduate 。
词素引用规则与前面 tsvector 中的规则一样; 同时,也和 tsvector 一样, 任何需要标准化的单词必须在转换为 tsquery 类型之前完成。 to_tsquery 函数可以方便地用来进行这类标准化操作:
SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat'