返回首页

gbase数据、南大通用产品文档:GBase8aNEAR 搜索函数

更新日期:2024年09月11日

语法格式
NEAR ((term1, term2), num[,Order])
表5- 46 参数说明
参数名称


term
为搜索词,
无论是否有引号标识,
都按照短语搜索,
如near((北
京,天津),10)等价于near(("北京","天津"),10),
term 也可以是一
个Near 表达式,两个term 用逗号分割。英文为词,中文默认
为单字。
NUM
表示词距数,非0 整数,词距(包括匹配词),实际词距小
于num 值即为符号要求
Order
表示词序。为0 代表无词序,
为1 代表有词序。
Order 为可
选项,默认值为0,表示无词序。
例如near((great, place), 3,1), 查找great 和place 两词词距不超过3,按词序查询。
1.
文本匹配条件描述

按照参数order 输入值:

0:无顺序包括所有查询词语;

非0 整数:有顺序包括所有查询词语。

匹配词词距不超出预期值(包括匹配词);

支持递归匹配,
每层递归结果均需要满足(1)(2)条件,
递归结果作为一个整体
传入下一次递归计算,其长度为匹配长度。
2.
搜索实例说明

输入查询语句“near((cat, dog), 5, 1)":

文本“cat dog”--- 匹配,词序正确;

文本“dog cat”--- 不匹配,dog cat 词序不匹配;

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
935

文本“cat aaa bbb ccc ddd dog”---不匹配,cat dog 之间有6 个词(包括匹配
词),超出匹配长度5。

输入查询语句“near((cat, dog), 5, 0)":

文本“cat dog”--- 匹配;

文本“dog cat”--- 匹配,无词序要求。

文本“dog aaa bbb ccc ddd cat”---不匹配,dog,cat 之间有6 个词(包括匹配
词),超出匹配长度5

输入查询语句"near( (near((cat, dog), 5, 1), mouse), 8, 0)"

文本“cat dog mouse”--- 匹配;

文本“mouse cat dog”--- 匹配;

文本“dog cat mouse”--- 不匹配,dog, cat 词序不匹配;

文本“cat aaa bbb ccc ddd dog mouse” ---不匹配,cat,dog 词距为6,超出匹
配长度5;

文本“cat aaa bbb ccc dog aaa bbb ccc ddd mouse”---不匹配,
cat, mouse 词距
为10 超出匹配长度8;

文本“cat aaa bbb ccc dog ddd
mouse”---匹配, cat 和dog 词距未超出,cat
和mouse 词距未超出;

文本“mouse ddd cat aaa bbb ccc dog”---匹配, cat 和dog 词距未超出,
mouse
和dog 词距未超出;
以上为句法讲解的例子,下面以实际的示例说明。
示例
示例1:要查询制作假文凭的垃圾短信内容。
gbase> SELECT MB_Text FROM sms WHERE contains(MB_Text, '"文
凭"/2');
+--------------------------------------------------------------+
| MB_Text
|
+--------------------------------------------------------------+
| 明天去公司办公柜里查找合同文件、档案和报销凭证。
|
| 本公司办理各种文*凭、证/件,绝对保真,联系电话:022-30088200。|
+--------------------------------------------------------------+
2 rows in set

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
936
从上面信息中发现正常的短信也查询出来了,我们改进一下查询方法。
gbase> SELECT MB_Text FROM sms WHERE contains(MB_Text, 'NEA
R((文,凭),4,1)');
+---------------------------------------------------------------+
| MB_Text
|
+---------------------------------------------------------------+
| 本公司办理各种文*凭、证/件,绝对保真,联系电话:022-30088200。|
+---------------------------------------------------------------+
1 row in set
示例2:查询包含南大两字,词距在4 的短信。
gbase> SELECT MB_Text FROM sms WHERE contains(MB_Text, '(NE
AR((南,大),4,0))');
+--------------------------------------------------------------+
| MB_Text
|
+--------------------------------------------------------------+
| 晚上去南大上英语课,在南大主楼115 房间
|
| 周末去天津博物馆参观,在南开区南门外大街公交车站集合
|
| 南大通用数据技术股份有限公司地址:...
|
| 南大开设java 编程培训班,每周五晚上7:00-9:00 上课
|
+--------------------------------------------------------------+
4 rows in set
示例3:想查询包含南大两字、词距在4 并且以课字结尾的短信。
gbase> SELECT MB_Text FROM sms WHERE contains(MB_Text,
'(NEAR((南,大),4,0))&课$');
+-----------------------------------------------------+
| MB_Text
|
+-----------------------------------------------------+
| 南大开设java 编程培训班,每周五晚上7:00-9:00 上课
|
+-----------------------------------------------------+
1 row in set

函数按照不同的处理逻辑,脱敏规则的获取方式也不相同,大致可分为两类。
1.
控制流函数可以直接返回脱敏列,而非对脱敏列进行比较和计算,这时函数会
将脱敏列的脱敏规则应用到其他返回值。这类函数有case when/decode、if、
ifnull、nvl 和coalesce 函数。举例如下:
select case col when 1 then '123' when 2 then '456' when 3 then mask_col else '789' end from t;
说明
其中col 为非脱敏列,mask_col 为脱敏列,“123”、“456”、“789” 为常量。
上面查询中case when 函数可能的返回值为’123’、’456’、’789’和mask_col,返
回值中包含了脱敏列,这时会对常量’123’、’456’和’789’按照脱敏列mask_col
的脱敏规则进行脱敏。

当这类函数的返回值中有多个脱敏列(不同列)时,该函数将使用默认脱敏规
则(不考虑多列脱敏规则是否完全相同)。
比如:
select nvl(mask_col1, mask_col2) from t;
nvl 函数将使用默认脱敏规则。

select nvl(mask_col1, mask_col1) from t;
nvl 函数仍将使用mask_col1 的脱敏规则。

当这类函数的返回值中既包含脱敏列,同时也包含非脱敏列(不是常量)时,
该函数也将使用默认脱敏规则。
比如:
select coalesce(col, mask_col) from t;
coalesce 函数将使用默认脱敏规则。

当这类函数的返回值中类型不完全相同时,
将会依据数据类型的转换规则进行

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
465
转换,
如果转换后的数据类型与脱敏列的原始类型不一致
(只考虑string、
real、
decimal 和int 四个级别,而不考虑更细的数据类型),则使用默认脱敏。
比如:
select coalesce(mask_int_col, 'abcdef') from t;
coalesce 函数返回值为string,
与mask_int_col 的类型(int)不一致,
所以coalesce
将使用默认脱敏。
默认脱敏时,
并不是将mask_int_col 的值转换为string,
而是直接返回string 类
型的默认脱敏值(xxxx)。
控制流函数类型转换规则:

任何一个参数为string 时,则按string 进行运算;

没有string 时,如果存在real,按real 进行运算;

没有string 和real 时,如果存在decimal,按decimal 进行运算;

日期时间类型算作string 类型。
控制流函数只对所有可能的返回值进行脱敏,对控制逻辑中的其他参数不脱
敏,比如case when 函数中只对then 和else 进行脱敏,对case 和when 分支中
的参数不脱敏。

Union、
Intersect 和Minus 运算时,
对应列的脱敏规则选取与控制流函数的脱敏
规则一致。
比如:
select mask_int_col from t union select mask_int_col as col from t;
将使用mask_int_col 的脱敏规则,而:
select mask_int_col from t union select mask_int_col+1 from t;
将使用默认脱敏。
2.
绝大部分函数是对参数进行比较或者计算,比如一些字符串函数、比较函数、
数值函数、时间和日期函数、OLAP 函数和聚集函数等,这类函数的参数如果
有脱敏列,函数将使用默认脱敏规则对返回值进行脱敏,而非对脱敏列脱敏后
参与运算。
举例如下:
select concat(mask_col, '123') from t;
其中mask_col 为脱敏列,’123’为常量。
上面查询中concat 函数并非将脱敏后的mask_col 字符串连接常量’123’,而是
对concat 返回值进行默认脱敏。
由于concat 返回值是字符类型,
所以上述结果
除mask_col 为NULL 的情况外(NULL 值情况返回值为NULL),始终返

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
466
回’xxxx’。
再比如select mask_col > 1 from t; 将依据函数“>”的返回值类型使用默认脱
敏规则,所以除mask_col 为NULL 值外,始终返回0。
脱敏列脱敏后如果超过脱敏列的最大长度,则自动截断为脱敏列的最大长度。
比如脱敏列定义为:
mask_col varchar(5) masked with (function ='partial(2,"xxxx",2)')
则值“abcde”理论上应脱敏为“abxxxxde”,脱敏后的长度超过了最大长度5,
自动截断为“abxxx”。
同样,对于一些可设置长度的函数脱敏时也会被截断,比如:
select left(mask_col, 2) from t;
left 函数将使用默认脱敏,理论上应脱敏为“xxxx”,但超过了left 函数设置
的最大长度,所以自动截断为“xx”。


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 159 -

当某行包含定义在 ROW 类型上的列时,您可使用点符号表示法来指定仅删除那些包含特
定字段值的行。例如,下列语句仅从 employee 表中删除address 列中的 city 字段的值为 San
Jose 的那些行:
DELETE FROM employee
WHERE address.city = 'San Jose';
在前面的语句中,address 列可能是命名的 ROW 类型或未命名的 ROW 类型。您用来指
定 ROW 类型的字段值的语法是相同的。