返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

|
===========================================================
=======
$gcadmin showdistribution vc vc2
Distribution ID: 2 | State: new | Total segment num: 4
Primary Segment Node IP
Segment ID
Duplicate Segment node IP
===========================================================
=======
|

NEAR ((term1, term2), num[,Order])

term:
为搜索词,
无论是否有引号标识,
都按照短语搜索,
如near((北京,天津),10)
等价于near(("北京","天津"),10),
term 也可以是一个Near 表达式,
两个term 用
逗号分割。英文为词,中文默认为单字。

NUM:表示词距数,非0 整数,词距(包括匹配词)

Order:表示词序。 为 0 代表无词序,为 1 代表有词序。Order 为可选项,默
认值为0,表示无词序。
例如 near((great, place), 3,
1), 查找great 和place 两词词距不超过3,
按词序查询。

1.
文本匹配条件描述

按照参数order 输入值
无顺序包括所有查询词语
非0 整数 - 有顺序包括所有查询词语

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

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

输入查询语句 “near((cat, dog), 5, 1)"
文本“cat dog”--- 匹配,词序正确。
文本“dog cat”--- 不匹配,dog, cat 词序不匹配

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 949
文本“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');
+--------------------------------------------------------------+
| text |
+--------------------------------------------------------------+
| 明天去公司办公柜里查找合同文件、档案和报销凭证。 |
| 本公司办理各种文*凭、证/件,绝对保真,联系电话:022-30088200。|
+--------------------------------------------------------------+

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 950
2 rows in set
从上面信息中发现正常的短信也查询出来了,我们改进一下查询方法。
gbase> SELECT MB_Text FROM sms WHERE contains(MB_Text, 'NEAR((文,凭),4,1)');
+---------------------------------------------------------------+
| text |
+---------------------------------------------------------------+
| 本公司办理各种文*凭、证/件,绝对保真,联系电话:022-30088200。|
+---------------------------------------------------------------+
1 row in set

示例2:查询包含南大两字,词距在4 的短信。
gbase> SELECT MB_Text FROM sms WHERE contains(MB_Text, '(NEAR((南,大),4,0))');


+--------------------------------------------------------------+
| MB_Text |
+--------------------------------------------------------------+
| 晚上去南大上英语课,在南大主楼115 房间 |
| 周末去天津博物馆参观,在南开区南门外大街公交车站集合 |
| 南大通用数据技术股份有限公司地址:... |
| 南大开设java 编程培训班,每周五晚上7:00-9:00 上课 |
+--------------------------------------------------------------+
4 rows in set
想查询包含南大两字、词距在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

incvfmtasc() 函数使用格式化掩码来将字符串转换为 interval 值。

语法
mint incvfmtasc(inbuf, fmtstring, invvalue)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 827 -

char *inbuf;
char *fmtstring;
intrvl_t *invvalue;
inbuf
指向包含要转换的字符串的缓冲区的指针。
fmtstring
指向包含要用于 inbuf 字符串的格式化掩码的缓冲区的指针。此时间格式化掩码包含
与 DBTIME 环境变量支持的相同的格式化伪指令。
invvalue
指向初始化了的 interval 变量的指针。

用法

您必须以您想要此变量拥有的限定符来初始化 invvalue 中的 interval 变量。interval
变量不需要指定与该格式化掩码相同的限定符。当 interval 限定符不同于隐含的格式化掩
码限定符时,必要时,incvfmtasc() 将结果转化为恰当的单位。然而,两个限定符都必须属
于同一 interval 类:或为 year to month 类,或为 day to fraction 类。

inbuf 中字符串中的所有字段都必须是相邻的。换句话说,如果限定符为 hour to
second,则您必须为该字符串中某处的 hour、minute 和 second 指定所有值,否则,
incvfmtasc() 返回错误。

inbuf 字符串可有开头和结尾的空格。然而,从第一个有效数字至最后一个,inbuf 仅
可包含适于该格式化掩码暗指的限定符字段的数字和定界符。

如果该字符串是可接受的,则 incvfmtasc() 函数设置 invvalue 中的 interval 值,并
返回零。否则,该函数返回错误代码,且 interval 变量包含不可预料的值。

DBTIME 环境变量接收的格式化伪指令 %B、%b 和 %p 在 fmtstring 中不适用,
因为 month name 和 a.m./p.m. 信息与时间的间隔无关。如果 interval 多于 99 年,则请
使用 %Y 伪指令(%y 仅可处理两位数字)。对于小时,请使用 %H(而不是 %I,因
为 %I 仅可表示 12 小时)。如果 fmtstring 为空字符串,则该函数返回错误。

返回代码

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 828 -

0
转换成功。
<0
转换失败。

示例
demo 目录在文件 incvfmtasc.ec 中包含此样例程序。
/* *incvfmtasc.ec*
The following program illustrates the conversion of two strings to three interval
values.
*/

#include

EXEC SQL include datetime;

main()
{
char out_str[30];
char out_str2[30];
char out_str3[30];
mint x;


EXEC SQL BEGIN DECLARE SECTION;
interval day to minute short_time;
interval minute(5) to second moment;
interval hour to second long_moment;
EXEC SQL END DECLARE SECTION;

printf("INCVFMTASC Sample ESQL Program running.\n\n");

/* Initialize short_time */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 829 -

printf("Interval value #1 = 20 days, 3 hours, 40 minutes\n");
x = incvfmtasc("20 days, 3 hours, 40 minutes",
"%d days, %H hours, %M minutes", &short_time);

/*Convert the internal format to ascii in ANSI format, for displaying. */
x = intoasc(&short_time, out_str);
printf("Interval value (day to minute) = %s\n", out_str);

/* Initialize moment */
printf("\nInterval value #2 = 428 minutes, 30 seconds\n");
x = incvfmtasc("428 minutes, 30 seconds",
"%M minutes, %S seconds", &moment);

/* Convert the internal format to ascii in ANSI format, for displaying. */
x = intoasc(&moment, out_str2);
printf("Interval value (minute to second) = %s\n", out_str2);

/* Initialize long_moment */
printf("\nInterval value #3 = 428 minutes, 30 seconds\n");
x = incvfmtasc("428 minutes, 30 seconds",
"%M minutes, %S seconds", &long_moment);

/*Convert the internal format to ascii in ANSI format, for displaying. */
x = intoasc(&long_moment, out_str3);
printf("Interval value (hour to second) = %s\n", out_str3);

printf("\nINCVFMTASC Sample Program over.\n\n");
}
输出
INVCFMTASC Sample ESQL Program running.

Interval value #1 = 20 days, 3 hours, 40 minutes
Interval value (day to minute) = 20 03:40

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 830 -


Interval value #2 = 428 minutes, 30 seconds
Interval value (minute to second) = 428:30

Interval value #3 = 428 minute, 30 seconds
Interval value (hour to second) = 7:08:30