PostgreSQL 数据类型 tsquery
1 背景知识
PostgreSQL提供两种数据类型,它们被设计用来支持全文搜索。
1、全文搜索是能够通过查询动作在文档集合中搜索匹配的关键字。
2、 tsvector
类型表示一个为文本搜索优化的形式下的字段。
3、 tsquery
类型表示一个文本查询动作。
第 12 章提供了对于这种功能的详细解释,并且第 9.13 节总结了相关的函数和操作符。
2 tsquery 操作符
tsquery 操作符 <->
(FOLLOWED BY) 可以搜索短语是否匹配。
2.1 基本文本匹配
只有当操作符的参数的匹配是相邻的,并且出现的 顺序
和词位的 位置
一致时。该操作符才算是匹配。
fatal
和error
紧挨着,并且fatal
出现在error
之前。所以匹配成功。
SELECT to_tsvector('fatal error') @@ to_tsquery('fatal <-> error');
//屏幕输出:
?column?
----------
t
fatal
和error
中间相差两个单词,并且fatal
出现在error
之后。所以匹配失败。
SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error');
//屏幕输出:
?column?
----------
f
2.2 tsquery 操作符 <N>
<N>
是一个表示匹配 词位
之间的差距值。
- phraseto_tsquery 函数利用这个操作符来构造一个能够匹配多词短语的
tsquery
。 <1>
和<->
相同,表示两个相邻的词位
。
SELECT phraseto_tsquery('cats ate rats');
//屏幕输出:
phraseto_tsquery
-------------------------------
'cat' <-> 'ate' <-> 'rat'
the
是停用单词词,<2>
表示词位
和词位
之间相差2
个位值。
SELECT phraseto_tsquery('the cats ate the rats');
//屏幕输出:
phraseto_tsquery
-------------------------------
'cat' <-> 'ate' <2> 'rat'
<2>
操作符匹配成功。
SELECT to_tsvector('fatal the error') @@ to_tsquery('fatal <2> error');
//屏幕输出:
?column?
----------
t
(1 row)
2.3 tsquery 操作符的优先级
1、圆括号可以被用来控制 tsquery
操作符的嵌套。
2、如果没有圆括号时,优先级顺序如下:
符号 | 优先级 |
---|---|
` | ` |
& |
1(低) |
<-> |
2 (高) |
! |
3 (最高) |
2.4 tsquery 逻辑判断符 AND/OR/NOT
操作符 | @@ 操作符 |
---|---|
!x |
不包含 x 的文档。 |
x & y |
同时包含 x 和 y 的文档。 |
!x <-> y |
不包含 x 并且下一个词位为 y 的文档。 |
(x & y) <-> z |
包含 x 和 y ,并且下一个词位为 y 的文档。 |
x <-> z & y <-> z |
匹配一个含有两个单独序列 x z 以及 y z 的文档 |
Note
x <-> z & y <-> z
这个特定的查询不会匹配任何文档,因为 x
和 y
不可能在同一个位置匹配,但是对于前缀匹配模式之类的更复杂的情况,这种形式的查询就会有用武之地。