Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


CTX_DOC系统包

📄字数 3.1K
👁️阅读量 加载中...

一、概述

CTX_DOC系统包是文本检索全文索引的辅助工具,主要用于配合全文检索功能。其功能包括设置分词策略以及进行文本分词。

在该系统包中提供了以下接口:

包体函数名简要描述
SET_SPLIT_POLICT设置分词策略
TOKENS文本分词
TOEKNS2文本分词

典型应用场景,如:

  • 检查文本索引是否正确提取关键词,使用TOKENS查看文档中的索引词

提示

TOKENS、TOEKNS2都支持对不同文本类型数据进行分词。区别在于TOKENS返回结果包括分词、在文本中首次出现位置、分词大小,TOEKNS2返回分词、重复出现次数以及分词大小

二、SET_SPLIT_POLICT

2.1 功能描述

该接口用于设置分词策略,通常在文本分词前需要进行设置(若不设置,则默认按最长词划分)

2.2 方法声明

sql
PROCEDURE SET_SPLIT_POLICY(
    _POLICY     IN INTEGER
    );

2.3 参数说明

参数名类型取值范围是否可选描述
_POLICYINTEGER0/1/2/4/8/16设置分词策略
sql
取值范围各自表示分词策略如下,这些常量常常组合使用来满足复杂需求
SP_MAX_LEN  CONSTANT INTEGER := 0; --按最长词划分
SP_MIN_LEN  CONSTANT INTEGER := 1; --按最短词划分
SP_SUB_WORD1 CONSTANT INTEGER := 2; --结果包括子词组成的单独词(不仅保留完整词,还包含所有子词)
SP_SUB_WORD2 CONSTANT INTEGER := 4; --结果包括非头部子词组成的单独词(仅提取非头部开始的子词)
SP_ASCII     CONSTANT INTEGER := 8; --结果包括ascii串(无需参照词表)
SP_DIGIT     CONSTANT INTEGER := 16; --结果包括数字串(无需参照词表)

2.4 示例

sql
-- 设置分词策略为按最长词划分+返回ascii串+数字串
SQL> BEGIN
        CTX_DOC.SET_SPLIT_POLICY(CTX_DOC.SP_MAX_LEN+CTX_DOC.SP_SUB_WORD1+ CTX_DOC.SP_SUB_WORD2+ CTX_DOC.SP_ASCII +CTX_DOC.SP_DIGIT);
     END;
     /

2.5 场景应用

  • 主要用于进行文本分词前,分词策略设置

三、TOKENS

3.1 功能描述

该接口用于文本分词。返回结果包括分词、在文本中首次出现位置、分词大小

注意

需要进行文本分词时,需提供词表,必须放置于数据库安装目录下XVOC文件夹,并命名为STD_VOC.txt

3.2 方法声明

该方法有多种重载方式,对应对不同文本类型的数据进行分词

  • 重载形式一:文本类型为VARCHAR2

    sql
    PROCEDURE TOKENS(
        CONTENT    VARCHAR2, 
        RESTAB     IN OUT TOKEN_TAB
        );
  • 重载形式二:文本类型为CLOB

    sql
    PROCEDURE TOKENS(
        CONTENT    CLOB, 
        RESTAB     IN OUT TOKEN_TAB
        );

其中TOKEN_TAB定义如下:

sql
-- TOKEN为分词,OFFSET为在文本中的偏移量,LENGTH为分词大小
SUBTYPE TOKEN_REC IS RECORD(TOKEN VARCHAR(64),OFFSET INTEGER,LENGTH INTEGER);
SUBTYPE TOKEN_TAB IS TABLE OF TOKEN_REC;

3.3 参数说明

参数名类型取值范围是否可选描述
CONTENTVARCHAR2/CLOB文本内容
RESTABTOKEN_TAB文本分词结果

3.4 示例

sql
-- 首先创建一个词库文件,命名为STD_VOC.txt,写入内容'商业软件 挑战',放置于数据库安装目录下XVOC文件夹,登录系统库执行下面两条命令,完成词库的编译和加载
SQL> recompile vocable table 'STD_VOC' ;
SQL> load vocable table 'STD_VOC' ;

SQL> DECLARE
     TYPE TOKEN_REC IS RECORD(TOKEN VARCHAR(64),OFFSET INTEGER,LENGTH INTEGER);
     TYPE TOKEN_TAB IS TABLE OF TOKEN_REC;
     WORD_TAB TOKEN_TAB; -- 用于保存分词结果
     BEGIN
     CTX_DOC.SET_SPLIT_POLICY(CTX_DOC.SP_MAX_LEN + CTX_DOC.SP_SUB_WORD1 + CTX_DOC.SP_ASCII + CTX_DOC.SP_DIGIT); -- 设置分词策略
     CTX_DOC.TOKENS('LOCK大数据TB级乃至PB级庞大的体量给现有的商业软件在如何获取存储检索等问题上带来了巨大的挑战,这些挑战亟需解决',WORD_TAB); -- 进行分词
     FOR i IN 1 .. WORD_TAB.COUNT LOOP
        SEND_MSG(WORD_TAB(i).TOKEN || ' OFFSET = ' || WORD_TAB(i).OFFSET || ' LEN='||WORD_TAB(i).LENGTH); -- 输出分词信息:TOKEN OFFSET LEN
     END LOOP;
     END;
     /
-- 输出信息
LOCK OFFSET = 0 LEN=4
TB OFFSET = 13 LEN=2
PB OFFSET = 24 LEN=2
商业软件 OFFSET = 56 LEN=12
挑战 OFFSET = 125 LEN=6
挑战 OFFSET = 140 LEN=6

3.5 场景应用

  • 场景一:可使用TOKENS调试全文索引构建是否正确、词提取是否符合预期

四、TOKENS2

4.1 功能描述

该接口用于文本分词。返回结果包括分词、重复出现次数以及分词大小

4.2 方法声明

该方法有多种重载方式,其对应了对不同的文本类型数据进行分词

  • 重载形式一:文本类型为VARCHAR2

    sql
    PROCEDURE TOKENS2(
        CONTENT    VARCHAR2, 
        RESTAB     IN OUT TOKEN_TAB
        );
  • 重载形式二:文本类型为CLOB

    sql
    PROCEDURE TOKENS2(
        CONTENT    CLOB, 
        RESTAB     IN OUT TOKEN_TAB
        );

其中TOKEN_TAB定义如下:

sql
-- TOKEN为分词,REPET_N为分词重复出现次数,LENGTH为分词大小
SUBTYPE TOKEN_REC2 IS RECORD(TOKEN VARCHAR(64),REPET_N INTEGER,LENGTH INTEGER);
SUBTYPE TOKEN_TAB IS TABLE OF TOKEN_REC2;

4.3 参数说明

参数名类型取值范围是否可选描述
CONTENTVARCHAR2/CLOB文本内容
RESTABTOKEN_TAB文本分词结果

4.4 示例

sql
-- 首先创建一个词库文件,命名为STD_VOC.txt,写入内容'商业软件 挑战',放置于数据库安装目录下XVOC文件夹,登录系统库执行下面两条命令,完成词库的编译和加载
recompile vocable table 'STD_VOC' ;
load vocable table 'STD_VOC' ;

-- 对文本进行分词
SQL> DECLARE
     TYPE TOKEN_REC  IS RECORD(TOKEN VARCHAR(64),OFFSET INTEGER,LENGTH INTEGER);
     TYPE TOKEN_TAB  IS TABLE OF TOKEN_REC;
     WORD_TAB  TOKEN_TAB;
     BEGIN
     CTX_DOC.SET_SPLIT_POLICY(CTX_DOC.SP_MAX_LEN + CTX_DOC.SP_ASCII + CTX_DOC.SP_DIGIT); -- 设置分词策略
     CTX_DOC.TOKENS2('LOCK大数据TB级乃至PB级庞大的体量给现有的商业软件在如何获取存储检索等问题上带来了巨大的挑战,这些挑战亟需解决',WORD_TAB); -- 进行分词
     FOR i IN 1 .. WORD_TAB.COUNT LOOP
        SEND_MSG(WORD_TAB(i).TOKEN || ' repeat_num = ' || WORD_TAB(i).OFFSET || ' LEN='||WORD_TAB(i).LENGTH); -- 打印结果
     END LOOP;
     END;
     /
--输出结果
LOCK repeat_num = 1 LEN=4
PB repeat_num = 1 LEN=2
商业软件 repeat_num = 1 LEN=12
TB repeat_num = 1 LEN=2
挑战 repeat_num = 2 LEN=6

4.5 场景应用

  • 场景一:可使用TOKENS调试全文索引构建是否正确、词提取是否符合预期