全文搜索类型

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

    Parent topic: Greenplum 数据库数据类型

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

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

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

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

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

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

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

    1. to_tsvector
    2. -----------------
    3. 'fat':2 'rat':3

    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. 'fat' & 'rat' & !'cat'

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

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

    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)

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