BUG——DM -3217: 第1 行附近出现错误: 列[***]未编制全文索引或全文索引数据错误(全文索引、是否包含某些字符串)

一、情景

统计某字段中,包含某些字符串的行数

# 使用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的使用前景

  1. 使用 CONTAINS 子句查询时,<列名>必须是已经建立了全文索引并填充后的列,
    否则系统会报错;
  2. 支持精确字、词、短语及一段文字的查询,CONTAINS 谓词内支持 AND | AND NOT
    | OR 的使用,AND 的优先级高于 OR 的优先级;
  3. 支持对每个精确词(单字节语言中没有空格或标点符号的一个或多个字符)或短语
    (单字节语言中由空格和可选的标点符号分隔的一个或多个连续的词)的匹配。对词或短语
    中字符的搜索不区分大小写;
  4. 对于短语或一段文字的查询,根据词库,单个查找串被分解为若干个关键词,忽略
    词库中没有的词和标点符号,在索引上进行(关键词 AND 关键词)匹配查找。因而,不一
    定是精确查询;
  5. 英文查询不区分大小写和全角半角中英文字符;
  6. 不提供 Noise 文件,即不考虑忽略词或干扰词;
  7. 不支持通配符―*‖;
  8. 不提供对模糊词或变形词的查找;
  9. 不支持对结果集的相关度排名;
  10. 检索条件子句可以和其他子句共同组成 WHERE 的检索条件。

2、全文索引

2.1.全文索引定义语句

用户可以在指定的表的文本列上建立全文索引。
语法格式

CREATE CONTEXT INDEX <索引名> ON [<模式名>.] <表名> (<索引列定义>) [<表空间子句>] 
[<STORAGE 子句>] [LEXER <分词参数>] [<SYNC 子句>];
<索引列定义><表空间子句>[<STORAGE 子句>] 请参考本章 3.6.1 索引定义语句相关内容
<SYNC 子句> ::= SYNC [TRANSACTION]

参数

  1. <索引名> 指明要创建的全文索引的名称,由于系统会为全文索引名加上前缀与
    后缀,因此用户指定的全文索引名长度不能超过122字节;
    第 3 章 数据定义语句
    164
  2. <模式名> 指明要创建全文索引的基表属于哪个模式,缺省为当前模式;
  3. <表名> 指明要创建全文索引的基表的名称;
  4. <列名> 指明基表中要创建全文索引的列的名称;
  5. <分词参数> 指明全文索引分词器的分词参数;
  6. <storage 子句> 只有指定表空间参数有效,其他参数无效(即 STORAGE ON xxx
    或者 TABLESPACE xxx 有效,而诸如 INITIAL、NEXT 等无效);
  7. <SYNC 子句> 指明全文索引的同步类型。不指定<SYNC 子句>时创建全文索引后
    系统不进行全文索引填充;指定为 SYNC 时系统将在全文索引建立后对全文索引执行一次完
    全填充;指定为 SYNC TRANSACTION 时系统将在每次事务提交后,自动以增量更新方式
    填充全文索引,不需要用户手动填充。
    图例
    全文索引定义语句
    在这里插入图片描述
    语句功能
    供具有 DBA 角色(三权分立)、DB_OBJECT_ADMIN 角色(四权分立)或该全文索引基
    表的拥有者且具有 CREATE CONTEXT INDEX 或 CREATE ANY CONTEXT INDEX 权限的
    用户,在指定的表的文本列上建立全文索引。
    使用说明
  8. 全文索引必须在一般用户表上定义,而不能在系统表、视图、临时表、列存储表和
    外部表上定义;
  9. 一个全文索引只作用于表的一个文本列,不允许为组合列和计算列;
  10. 同一列只允许创建一个全文索引;
  11. <列名>为文本列,类型可为CHAR、CHARACTER、VARCHAR、LONGVARCHAR、TEXT
    或CLOB;
  12. TEXT、CLOB类型的列可存储二进制字符流数据。如果用于存储DM全文检索模块能
    识别的格式简单的文本文件(如.txt,html等),则可为其建立全文索引;
  13. 全文索引支持简体中文和英文;
  14. 分词参数有5种:CHINESE_LEXER,中文最少分词;CHINESE_VGRAM_LEXER,
    机械双字分词,CHINESE_FP_LEXER,中文最多分词;ENGLISH_LEXER,英文分词;
    DEFAULT_LEXER,中英文最少分词,也是默认分词;
  15. 创建全文索引时,若不指定<SYNC子句>,系统在创建全文索引后不进行填充,需
    要用户使用全文索引修改语句填充索引信息后才能进行全文检索;指定为SYNC时系统将在
    全文索引建立后对全文索引执行一次完全填充;指定为SYNC TRANSACTION时,每次事务
    提交后,若基表数据发生变化,系统会自动以增量更新方式填充全文索引;
  16. 不支持快速装载建有全文索引的表。
    举例说明
    例 用户 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 <分词参数>];

参数

  1. <索引名> 指明被操作的全文索引的名称;
  2. <模式名> 指明被操作的全文索引属于哪个模式,缺省为当前模式;
  3. <表名> 指明被操作的基表的名称。
    图例
    全文索引修改语句
    在这里插入图片描述
    语句功能
    供具有 DBA 角色(三权分立)的用户或该全文索引基表的拥有者(拥有者需同时具有
    ALTER ANY CONTEXT INDEX 权限)在指定的表的文本列上修改全文索引。
    REBUILD 为完全填充,此方式首先会将全文索引辅助清空,再将基表中所有记录逐个
    取出,根据分词算法获得分词结果,即字/词所在记录的 ROWID 和出现次数,保存在词表
    中。INCREMENT 为增量填充,此方式只是将基表中发生数据变化的记录执行分词并保存分
    词结果。OPTIMIZE 操作仅仅对全文索引辅助表进行优化,去除冗余信息,不影响查询结果。
    使用说明
  4. 若未使用 SYNC 选项创建全文索引,则需要以 REBUILD 方式调用此语句,然后才
    能进行全文检索。这时该修改语句起到填充全文索引信息的作用;
  5. 当该列数据更新后,为了对更新后的数据进行检索,需要再次填充全文索引信息,
    以确保查询的正确性;
  6. DM 服务器启动时,不会自动加载词库,而是在第一次执行全文索引填充时加载,
    之后直到服务器停止才释放;
  7. 在完全更新全文索引后,如果表数据发生少量更新,利用 INCREMENT 增量填充方
    式更新全文索引可以提高效率;
  8. 语句中指定 ONLINE 选项时,指明对全文索引进行异步填充,允许同时对全文索
    引所在的表进行增删改操作;
  9. LEXER 子句只能与 REBUILD 方式一起使用。
    举例说明
    例 用户 SYSDBA 需要在 PERSON 模式下的 ADDRESS 表的 ADDRES1 列上完全填充全
    文索引,可以用下面的语句:
ALTER CONTEXT INDEX INDEX0001 ON PERSON.ADDRESS REBUILD;

2.3.全文索引删除语句

删除全文索引。
语法格式

DROP CONTEXT INDEX [IF EXISTS] <索引名> ON [<模式名>.] <表名>;

参数

  1. <索引名> 指明被操作的全文索引的名称;
  2. <模式名> 指明被操作的全文索引属于哪个模式,缺省为当前模式;
  3. <表名> 指明被操作的基表的名称。
    图例
    全文索引删除语句
    在这里插入图片描述
    语句功能
    供具有 DBA 角色(三权分立)的用户或该全文索引基表的拥有者或该全文索引所属基
    表的拥有者删除全文索引,包括删除数据字典中的相应信息和全文索引内容。
    使用说明
  4. 删除不存在的全文索引会报错。若指定 IF EXISTS 关键字,删除不存在的全文索
    引,不会报错;
  5. 除了该语句可删除全文索引外,当数据库模式发生如下改变时,系统将自动调用全
    文索引删除模块:
  1. 删除表时,删除表上的全文索引;
  2. 删除建立了全文索引的列时,删除列上的全文索引;
  1. 不允许修改建有全文索引的列。
    举例说明
    例 用户 SYSDBA 需要删除在 PERSON 模式下 ADDRESS 表的全文索引,可以用下面的
    语句:
DROP CONTEXT INDEX INDEX0001 ON PERSON.ADDRESS;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值