文章目录
- 一、情景
- 二、报错
- 三、解决
- 四、说明
- 1、CONTAINS的使用前景
- 2、全文索引
- 2.1.全文索引定义语句
- 2.2.全文索引修改语句
- 2.3.全文索引删除语句
一、情景
统计某字段中,包含某些字符串的行数
# 使用CONTAINS
select sum(case when CONTAINS(my_column,'123') then 1 else 0 end) as ca from My_DEV.my_table;
# 使用instr
select sum(case when instr(my_column,'123')>0 then 1 else 0 end) as ca from My_DEV.my_table;
二、报错
-3217: 第1 行附近出现错误:
列[***]未编制全文索引或全文索引数据错误
三、解决
如果索引存在,请刷一下数据
# 创建全文索引,并增量填充
CREATE CONTEXT INDEX INDEX_STATISTICAL ON MY_DEV.my_table(my_column) LEXER CHINESE_LEXER SYNC TRANSACTION;
# 删除指定全文索引
DROP CONTEXT INDEX INDEX_STATISTICAL ON MY_DEV.my_table;
# 全文索引全量填充
ALTER CONTEXT INDEX INDEX_STATISTICAL ON MY_DEV.my_table REBUILD;
四、说明
1、CONTAINS的使用前景
- 使用 CONTAINS 子句查询时,<列名>必须是已经建立了全文索引并填充后的列,
否则系统会报错; - 支持精确字、词、短语及一段文字的查询,CONTAINS 谓词内支持 AND | AND NOT
| OR 的使用,AND 的优先级高于 OR 的优先级; - 支持对每个精确词(单字节语言中没有空格或标点符号的一个或多个字符)或短语
(单字节语言中由空格和可选的标点符号分隔的一个或多个连续的词)的匹配。对词或短语
中字符的搜索不区分大小写; - 对于短语或一段文字的查询,根据词库,单个查找串被分解为若干个关键词,忽略
词库中没有的词和标点符号,在索引上进行(关键词 AND 关键词)匹配查找。因而,不一
定是精确查询; - 英文查询不区分大小写和全角半角中英文字符;
- 不提供 Noise 文件,即不考虑忽略词或干扰词;
- 不支持通配符―*‖;
- 不提供对模糊词或变形词的查找;
- 不支持对结果集的相关度排名;
- 检索条件子句可以和其他子句共同组成 WHERE 的检索条件。
2、全文索引
2.1.全文索引定义语句
用户可以在指定的表的文本列上建立全文索引。
语法格式
CREATE CONTEXT INDEX <索引名> ON [<模式名>.] <表名> (<索引列定义>) [<表空间子句>]
[<STORAGE 子句>] [LEXER <分词参数>] [<SYNC 子句>];
<索引列定义>、<表空间子句>、[<STORAGE 子句>] 请参考本章 3.6.1 索引定义语句相关内容
<SYNC 子句> ::= SYNC [TRANSACTION]
参数
- <索引名> 指明要创建的全文索引的名称,由于系统会为全文索引名加上前缀与
后缀,因此用户指定的全文索引名长度不能超过122字节;
第 3 章 数据定义语句
164 - <模式名> 指明要创建全文索引的基表属于哪个模式,缺省为当前模式;
- <表名> 指明要创建全文索引的基表的名称;
- <列名> 指明基表中要创建全文索引的列的名称;
- <分词参数> 指明全文索引分词器的分词参数;
- <storage 子句> 只有指定表空间参数有效,其他参数无效(即 STORAGE ON xxx
或者 TABLESPACE xxx 有效,而诸如 INITIAL、NEXT 等无效); - <SYNC 子句> 指明全文索引的同步类型。不指定<SYNC 子句>时创建全文索引后
系统不进行全文索引填充;指定为 SYNC 时系统将在全文索引建立后对全文索引执行一次完
全填充;指定为 SYNC TRANSACTION 时系统将在每次事务提交后,自动以增量更新方式
填充全文索引,不需要用户手动填充。
图例
全文索引定义语句
语句功能
供具有 DBA 角色(三权分立)、DB_OBJECT_ADMIN 角色(四权分立)或该全文索引基
表的拥有者且具有 CREATE CONTEXT INDEX 或 CREATE ANY CONTEXT INDEX 权限的
用户,在指定的表的文本列上建立全文索引。
使用说明 - 全文索引必须在一般用户表上定义,而不能在系统表、视图、临时表、列存储表和
外部表上定义; - 一个全文索引只作用于表的一个文本列,不允许为组合列和计算列;
- 同一列只允许创建一个全文索引;
- <列名>为文本列,类型可为CHAR、CHARACTER、VARCHAR、LONGVARCHAR、TEXT
或CLOB; - TEXT、CLOB类型的列可存储二进制字符流数据。如果用于存储DM全文检索模块能
识别的格式简单的文本文件(如.txt,html等),则可为其建立全文索引; - 全文索引支持简体中文和英文;
- 分词参数有5种:CHINESE_LEXER,中文最少分词;CHINESE_VGRAM_LEXER,
机械双字分词,CHINESE_FP_LEXER,中文最多分词;ENGLISH_LEXER,英文分词;
DEFAULT_LEXER,中英文最少分词,也是默认分词; - 创建全文索引时,若不指定<SYNC子句>,系统在创建全文索引后不进行填充,需
要用户使用全文索引修改语句填充索引信息后才能进行全文检索;指定为SYNC时系统将在
全文索引建立后对全文索引执行一次完全填充;指定为SYNC TRANSACTION时,每次事务
提交后,若基表数据发生变化,系统会自动以增量更新方式填充全文索引; - 不支持快速装载建有全文索引的表。
举例说明
例 用户 SYSDBA 需要在 PERSON 模式下的 ADDRESS 表的 ADDRES1 列上创建全文索
引,可以用下面的语句:
CREATE CONTEXT INDEX INDEX0001 ON PERSON.ADDRESS(ADDRESS1) LEXER CHINESE_LEXER;
2.2.全文索引修改语句
全文索引需要根据基表进行索引数据填充,若基表数据变化而没有更新全文索引,可能
引起全文检索结果不正确。
使用全文索引修改语句对全文索引进行完全填充和增量填充,使得全文索引的内容与表
数据保持同步。
语法格式
ALTER CONTEXT INDEX < 索引名 > ON [< 模式名 >.] < 表 名 > <REBUILD | INCREMENT |
OPTIMIZE>[ONLINE] [LEXER <分词参数>];
参数
- <索引名> 指明被操作的全文索引的名称;
- <模式名> 指明被操作的全文索引属于哪个模式,缺省为当前模式;
- <表名> 指明被操作的基表的名称。
图例
全文索引修改语句
语句功能
供具有 DBA 角色(三权分立)的用户或该全文索引基表的拥有者(拥有者需同时具有
ALTER ANY CONTEXT INDEX 权限)在指定的表的文本列上修改全文索引。
REBUILD 为完全填充,此方式首先会将全文索引辅助清空,再将基表中所有记录逐个
取出,根据分词算法获得分词结果,即字/词所在记录的 ROWID 和出现次数,保存在词表
中。INCREMENT 为增量填充,此方式只是将基表中发生数据变化的记录执行分词并保存分
词结果。OPTIMIZE 操作仅仅对全文索引辅助表进行优化,去除冗余信息,不影响查询结果。
使用说明 - 若未使用 SYNC 选项创建全文索引,则需要以 REBUILD 方式调用此语句,然后才
能进行全文检索。这时该修改语句起到填充全文索引信息的作用; - 当该列数据更新后,为了对更新后的数据进行检索,需要再次填充全文索引信息,
以确保查询的正确性; - DM 服务器启动时,不会自动加载词库,而是在第一次执行全文索引填充时加载,
之后直到服务器停止才释放; - 在完全更新全文索引后,如果表数据发生少量更新,利用 INCREMENT 增量填充方
式更新全文索引可以提高效率; - 语句中指定 ONLINE 选项时,指明对全文索引进行异步填充,允许同时对全文索
引所在的表进行增删改操作; - LEXER 子句只能与 REBUILD 方式一起使用。
举例说明
例 用户 SYSDBA 需要在 PERSON 模式下的 ADDRESS 表的 ADDRES1 列上完全填充全
文索引,可以用下面的语句:
ALTER CONTEXT INDEX INDEX0001 ON PERSON.ADDRESS REBUILD;
2.3.全文索引删除语句
删除全文索引。
语法格式
DROP CONTEXT INDEX [IF EXISTS] <索引名> ON [<模式名>.] <表名>;
参数
- <索引名> 指明被操作的全文索引的名称;
- <模式名> 指明被操作的全文索引属于哪个模式,缺省为当前模式;
- <表名> 指明被操作的基表的名称。
图例
全文索引删除语句
语句功能
供具有 DBA 角色(三权分立)的用户或该全文索引基表的拥有者或该全文索引所属基
表的拥有者删除全文索引,包括删除数据字典中的相应信息和全文索引内容。
使用说明 - 删除不存在的全文索引会报错。若指定 IF EXISTS 关键字,删除不存在的全文索
引,不会报错; - 除了该语句可删除全文索引外,当数据库模式发生如下改变时,系统将自动调用全
文索引删除模块:
- 删除表时,删除表上的全文索引;
- 删除建立了全文索引的列时,删除列上的全文索引;
- 不允许修改建有全文索引的列。
举例说明
例 用户 SYSDBA 需要删除在 PERSON 模式下 ADDRESS 表的全文索引,可以用下面的
语句:
DROP CONTEXT INDEX INDEX0001 ON PERSON.ADDRESS;