云数据库 GAUSSDB-文本搜索类型:tsquery

时间:2024-11-02 18:52:56

tsquery

tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
openGauss=# SELECT 'fat & rat'::tsquery;
    tsquery    
---------------
 'fat' & 'rat'
(1 row)

openGauss=# SELECT 'fat & (rat | cat)'::tsquery;
          tsquery          
---------------------------
 'fat' & ( 'rat' | 'cat' )
(1 row)

openGauss=# SELECT 'fat & rat & ! cat'::tsquery;
        tsquery         
------------------------
 'fat' & 'rat' & !'cat'
(1 row)

在没有括号的情况下,!(非)结合的最紧密,而&(和)结合的比|(或)紧密。

tsquery中的词汇可以用一个或多个权字母来标记,这些权字母限制这次词汇只能与带有匹配权的tsvector词汇进行匹配。

1
2
3
4
5
openGauss=# SELECT 'fat:ab & cat'::tsquery;
     tsquery      
------------------
 'fat':AB & 'cat'
(1 row)

同样,tsquery中的词汇可以用*标记来指定前缀匹配:

1
2
3
4
5
openGauss=# SELECT 'super:*'::tsquery;
  tsquery  
-----------
 'super':*
(1 row)

这个查询可以匹配tsvector中以“super”开始的任意单词。

请注意,前缀首先被文本搜索分词器处理,这也就意味着下面的结果为真:

1
2
3
4
5
openGauss=# SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ) AS RESULT;
  result  
----------
 t
(1 row)

因为postgres经过处理后得到postgr:

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

这样就匹配postgraduate了。

'Fat:ab & Cats'规范化转为tsquery类型结果如下:

1
2
3
4
5
openGauss=# SELECT to_tsquery('Fat:ab & Cats');
    to_tsquery    
------------------
 'fat':AB & 'cat'
(1 row)
support.huaweicloud.com/centralized-devg-v2-gaussdb/devg_03_0369.html