返回首页

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

更新日期:2024年09月11日

词、词序、词距
1.
词(Item):
也称为最小检索单位。在西文中,单词跟单词之间以空格分隔,检索的最小单
位就是一个单词。例如:“cat and mouse”,就是3 个词。对于多字节编码的
文字,像中文,因为词跟词之间没有明显的分隔符进行区分,所以GBase UP
默认是以单个字为一个检索单位。
例如
“上海”

在全文检索中默认是两个词,
分别是“上”和“海”,搜索(上&海),此时上海和海上都会命中 并且不保证
两字紧邻 如需紧邻则需要显式的设置“上海”。分析文本时,对于西文单词
之间的空格、换行符会直接被过滤掉,不作为索引词也不计算占用的位置。对
于中文字符之间的空格,以及其他符号(像全角的标点符号例如“”,。!;
¥【】等符号,特殊字符例如#,*,$等)也进行过滤,不作为索引词,但是建
立索引时会记录这些符号所占用的位置,这会影响词距。
2.
词序:
指二个词之间的前后顺序。在进行多个词查询的时候,需要指定查询的多个词
之间是有序查询还是无序查询,通过指定词序来过滤相关条件。例如要查询无
词序要求的“上海”,不仅能查出“上海”,还可查出“海上”。
3.
词距:
指二个词之间间隔单词数,也包含被查询的首尾词。例如:
“the black cat catch
white mouse”这段文字中要查询“cat mouse”,则词距就是4。对于中文来说,
则词距为两个汉字之间间隔的字符数
(字符包含汉字、
标点、
空格、
符号等等,
回车符略去不算)

例如
“上周,
我去海洋局开会...”
这段文字要查询
“上 海”


GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 940
则词距为6,例如查询“售卖制作假文*#凭、发*票”的垃圾短信中“文凭”,
则词距为4。
4.
空格的特殊性:
计算词距时,中英文之间的空格处理不同,英文之间的空格作为分隔符会被过
滤掉而且不占位置,例如搜索“the great” 时这两个词的词距为2,而中文之
间的空格则会占位,例如搜索“天 津”时,天津这两个字的词距为3,跟无空
格的“天津”是不同的。

编写和执行SQL 语句.................................. 358

返回集合中元素的个数,不计算被DELETE的元素
l
可变数组的COUNT
COUNT始终等于LAST,如果使用EXTEND或TRIM增加或减小可变数组,则COUNT也
随之改变。
CREATE OR REPLACE PROCEDURE P_5_23 AS
TYPE NumList IS VARRAY(10) OF INTEGER;
n NumList := NumList(1,3,5,7);
BEGIN
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');
DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
n.EXTEND(3);
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');
DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
n.TRIM(5);
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');
DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
END;

--Result:
--n.COUNT = 4, n.LAST = 4
--n.COUNT = 7, n.LAST = 7
--n.COUNT = 2, n.LAST = 2

l
内嵌表的COUNT
嵌套表的COUNT=LAST.除了当在嵌套表中DELETE元素,此时COUNTCREATE OR REPLACE PROCEDURE P_5_24 AS
TYPE NumList IS TABLE OF INTEGER;
n NumList := NumList(1,3,5,7);
BEGIN
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 82 -

DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
n.DELETE(3); -- Delete third element
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');
DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
n.EXTEND(2); -- Add two null elements to end
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');
DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
FOR i IN 1..8 LOOP
IF n.EXISTS(i) THEN
IF n(i) IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('n(' || i || ') = ' || n(i));
ELSE
DBMS_OUTPUT.PUT_LINE('n(' || i || ') = NULL');
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE('n(' || i || ') does not exist');
END IF;
END LOOP;
END;

--Result:
--n.COUNT = 4, n.LAST = 4
--n.COUNT = 3, n.LAST = 4
--n.COUNT = 5, n.LAST = 6
--n(1) = 1
--n(2) = 3
--n(3) does not exist
--n(4) = 7
--n(5) = NULL
--n(6) = NULL
--n(7) does not exist
--n(8) does not exist