PostgreSQL 数据类型 tsquery

1 背景知识

PostgreSQL提供两种数据类型,它们被设计用来支持全文搜索。
1、全文搜索是能够通过查询动作在文档集合中搜索匹配的关键字。
2、 tsvector 类型表示一个为文本搜索优化的形式下的字段。
3、 tsquery 类型表示一个文本查询动作。

第 12 章提供了对于这种功能的详细解释,并且第 9.13 节总结了相关的函数和操作符。

2 tsquery 操作符

tsquery 操作符 <->(FOLLOWED BY) 可以搜索短语是否匹配。

2.1 基本文本匹配

只有当操作符的参数的匹配是相邻的,并且出现的 顺序 和词位的 位置 一致时。该操作符才算是匹配。

  1. fatalerror 紧挨着,并且 fatal 出现在 error 之前。所以匹配成功。
SELECT to_tsvector('fatal error') @@ to_tsquery('fatal <-> error');
//屏幕输出:
 ?column? 
----------
 t
  1. fatalerror 中间相差两个单词,并且 fatal 出现在 error 之后。所以匹配失败。
SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error');
//屏幕输出:
 ?column? 
----------
 f

2.2 tsquery 操作符 <N>

<N> 是一个表示匹配 词位 之间的差距值。

  1. phraseto_tsquery 函数利用这个操作符来构造一个能够匹配多词短语的 tsquery
  2. <1><-> 相同,表示两个相邻的 词位
SELECT phraseto_tsquery('cats ate rats');
//屏幕输出:
       phraseto_tsquery        
-------------------------------
 'cat' <-> 'ate' <-> 'rat'
  1. the 是停用单词词,<2> 表示 词位词位 之间相差 2 个位值。
SELECT phraseto_tsquery('the cats ate the rats');
//屏幕输出:
       phraseto_tsquery        
-------------------------------
 'cat' <-> 'ate' <2> 'rat'
  1. <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 同时包含 xy 的文档。
!x <-> y 不包含 x 并且下一个词位为 y 的文档。
(x & y) <-> z 包含 xy,并且下一个词位为 y 的文档。
x <-> z & y <-> z 匹配一个含有两个单独序列 x z 以及 y z 的文档
Note

x <-> z & y <-> z 这个特定的查询不会匹配任何文档,因为 xy 不可能在同一个位置匹配,但是对于前缀匹配模式之类的更复杂的情况,这种形式的查询就会有用武之地。

Connected Pages
On this page
  • 1 背景知识
  • 2 tsquery 操作符
  • 2.1 基本文本匹配
  • 2.2 tsquery 操作符
  • 2.3 tsquery 操作符的优先级
  • 2.4 tsquery 逻辑判断符 AND/OR/NOT