全文搜索类型

Greenplum 数据库提供两种数据类型,这两种数据类型被设计来支持全文搜索,即搜索自然语言 文档 集合并定位与一个 查询 最匹配内容。 tsvector 类型以一种专为全文搜索优化的形式表示一个文档; 类似地, tsquery 类型表示一个文本查询。 使用全文搜索 有这方面支持的详细解释, 文本搜索函数和操作符 总结了相关函数和操作。

tsvector 和 tsquery 类型不能是 Greenplum 数据库表的分布键的一部分。

Parent topic: Greenplum 数据库数据类型

tsvector

一个 tsvector 值是不同 词素(lexemes) 的排序列表, 也就是由对不同形式的词进行合并,已经被 标准化 的单词组成的列表 (更多细节,请参考 使用全文搜索)。 排序和去重在输入过程中已经自动完成。请看以下例子:

  1. SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
  2. tsvector
  3. ----------------------------------------------------
  4. 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'

要表示包含空格和标点符号的词素,可以用单引号把它们包围起来:

  1. SELECT $$the lexeme ' ' contains spaces$$::tsvector;
  2. tsvector
  3. -------------------------------------------
  4. ' ' 'contains' 'lexeme' 'spaces' 'the'

(在这个例子中,我们使用了 $$ 引起来的字符串字面值。下一个例子中,我们使用常规的单引号引起来的字符串,所以字面值中嵌入的单引号必须双写进行转义。) 单引号引起来的词素中嵌入的单引号(‘)和反斜杠(\)必须双写:

  1. SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
  2. tsvector
  3. ------------------------------------------------
  4. 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'

可选的, 整数 定位数值 可以被附加到词素:

  1. 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;
  2. tsvector
  3. -------------------------------------------------------------------------------
  4. '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 是默认权重因此在输出中不会显示:

  1. SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
  2. tsvector
  3. ----------------------------
  4. 'a':1A 'cat':5 'fat':2B,4C

典型地,权重被用来反映文档结构, 例如, 可以使用不同权重标记标题与正文中的单词。全文搜索排名函数能够对不同权重标记指派不同优先级。

理解 tsvector 类型本身并不进行任何标准化非常重要; 它假定给它的单词已经为应用进行了适当地标准化。例如,

  1. select 'The Fat Rats'::tsvector;
  2. tsvector
  3. --------------------
  4. 'Fat' 'Rats' 'The'

对大多数英文全文搜索应用,上面的单词被认为是非标准化的,但是 tsvector 并不在意。原始文档文本应该总是通过 to_tsvector 函数来为搜索进行适当地标准化:

  1. SELECT to_tsvector('english', 'The Fat Rats');
  2. to_tsvector
  3. -----------------
  4. 'fat':2 'rat':3

tsquery

一个 tsquery 值为搜索存储词素,同时结合它们实现布尔操作 & (与), | (或), 以及 ! (非)。 括号可以用来表示分组操作:

  1. SELECT 'fat & rat'::tsquery;
  2. tsquery
  3. ---------------
  4. 'fat' & 'rat'
  5. SELECT 'fat & (rat | cat)'::tsquery;
  6. tsquery
  7. ---------------------------
  8. 'fat' & ( 'rat' | 'cat' )
  9. SELECT 'fat & rat & ! cat'::tsquery;
  10. tsquery
  11. ------------------------
  12. 'fat' & 'rat' & !'cat'

不使用括号时, ! (非) 具有最高优先级, 另外 & (与) 优先级高于 | (或)。

可选地, 一个 tsquery 中的词素可以带一个或多个权重标记字母,用来限制他们只与合适权重的 tsvector 相匹配:

  1. SELECT 'fat:ab & cat'::tsquery;
  2. tsquery
  3. ------------------
  4. 'fat':AB & 'cat'

Also, 一个 tsquery 中的词素也可以用星号(*)指定前缀匹配:

  1. SELECT 'super:*'::tsquery;
  2. tsquery
  3. -----------
  4. 'super':*

这个查询会匹配一个以 “super” 开头的 tsvector 中的任何单词。 注意前缀会被全文搜索配置首先处理,也就是说这个比较会返回 true (真):

  1. SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' );
  2. ?column?
  3. ----------
  4. t
  5. (1 row)

因为 postgres 中提取的词干是 postgr :

  1. SELECT to_tsquery('postgres:*');
  2. to_tsquery
  3. ------------
  4. 'postgr':*
  5. (1 row)

所以就匹配到了 postgraduate 。

词素引用规则与前面 tsvector 中的规则一样; 同时,也和 tsvector 一样, 任何需要标准化的单词必须在转换为 tsquery 类型之前完成。 to_tsquery 函数可以方便地用来进行这类标准化操作:

  1. SELECT to_tsquery('Fat:ab & Cats');
  2. to_tsquery
  3. ------------------
  4. 'fat':AB & 'cat'