云数据库 GAUSSDB-文本搜索类型:tsquery
tsquery
tsquery类型表示一个检索条件,存储用于检索的词汇,并且使用布尔操作符&(AND),|(OR)和!(NOT)来组合他们,括号用来强调操作符的分组。to_tsquery函数及plainto_tsquery函数会将单词转换为tsquery类型前进行规范化处理。tsquery类型支持的最大长度没有限制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
gaussdb=# SELECT 'fat & rat'::tsquery; tsquery --------------- 'fat' & 'rat' (1 row) gaussdb=# SELECT 'fat & (rat | cat)'::tsquery; tsquery --------------------------- 'fat' & ( 'rat' | 'cat' ) (1 row) gaussdb=# SELECT 'fat & rat & ! cat'::tsquery; tsquery ------------------------ 'fat' & 'rat' & !'cat' (1 row) |
在没有括号的情况下,!(非)结合的最紧密,而&(和)结合的比|(或)紧密。
tsquery中的词汇可以用一个或多个权字母来标记,这些权字母限制这次词汇只能与带有匹配权的tsvector词汇进行匹配。
1 2 3 4 5 |
gaussdb=# SELECT 'fat:ab & cat'::tsquery; tsquery ------------------ 'fat':AB & 'cat' (1 row) |
同样,tsquery中的词汇可以用*标记来指定前缀匹配:
1 2 3 4 5 |
gaussdb=# SELECT 'super:*'::tsquery; tsquery ----------- 'super':* (1 row) |
这个查询可以匹配tsvector中以“super”开始的任意单词。
请注意,前缀首先被文本搜索分词器处理,这也就意味着下面的结果为真:
1 2 3 4 5 |
gaussdb=# SELECT to_tsvector( 'seriousness' ) @@ to_tsquery( 'series:*' ) AS RESULT; result ---------- t (1 row) |
因为series经过处理后得到seri:
1 2 3 4 5 |
gaussdb=# SELECT to_tsquery('series:*'); to_tsquery ------------ 'seri':* (1 row) |
这样就匹配eriousness了。
'Fat:ab & Cats'规范化转为tsquery类型结果如下:
1 2 3 4 5 |
gaussdb=# SELECT to_tsquery('Fat:ab & Cats'); to_tsquery ------------------ 'fat':AB & 'cat' (1 row) |