Oracle全文索引的查询模板功能可以对在CONTEXT索引上使用CATSEARCH语法,或者在CTXCAT索引上使用CONTAINS语法。
Oracle数据库Text单字无法全文搜索---如果项目需要在Oracle数据库下面做全文搜索,你可以选择Oracle自带的全文组件OracleText,从定义索引器(CHINESE_VGRAM_LEXER),建立CTXCAT索引,使用CATSEARCH查询一切都很顺利地进行,但是当加上中文分词后总不经意地抛出异常,提示:
ORA-29902:执行ODCIIndexStart() 例行程序中出错;
ORA-20000:Oracle Text Error;
DRG-10847:CATSEARCH 要求这种类型的查询有前缀索引;
现象:我对一个列建了CTXCAT索引
创建索引的语句:
DROP INDEX ST_ITEM_ITEM_NAME;
CREATE INDEX ST_ITEM_ITEM_NAME
ON ST_ITEM (ITEM_NAME)
INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ( 'LEXER CTXSYS.CHINESE_VGRAM_LEXER ');
然后使用如下语句查询
select count(*) from ST_ITEM where catsearch(name, '我 ',null)> 0
报错:
ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
ORA-20000: Oracle Text error:
DRG-10847: catsearch 要求这种类型的查询有前缀索引
如果是select count(*) from ST_ITEM where catsearch(name, '我们 ',null)> 0
就不会报错,我的索引用的是CHINESE_VGRAM_LEXER
但是如果使用CONTEXT类型索引就不会报错,这是怎么地一回事呢?
既然错误提示说在列中没有前缀索引,那就可以找一个为索引建立前缀索引的方法:
1、建立索引器,使用如下代码:
Begin
ctx_ddl.drop_preference ('mydb.CHINESE_LEXER');
ctx_ddl.create_preference ('mydb.CHINESE_LEXER', 'CHINESE_VGRAM_LEXER');
ctx_ddl.create_preference('mydb.ChineseWordList', 'BASIC_WORDLIST');
ctx_ddl.set_attribute('mydb.ChineseWordList','PREFIX_INDEX','TRUE');
ctx_ddl.set_attribute('mydb.ChineseWordList','PREFIX_MIN_LENGTH',1);
ctx_ddl.set_attribute('mydb.ChineseWordList','PREFIX_MAX_LENGTH', 5);
ctx_ddl.set_attribute('mydb.ChineseWordList','SUBSTRING_INDEX', 'YES');
END;
2、建立索引,使用如下代码:
Create INDEX indexName on tableName(columnName)
indextype is ctxsys.CTXCAT parameters('lexer mydb.chinese_lexer wordlist mydb.chinesewordlist');
再执行上面出错的SQL语句,结果正常!
OracleText要支持中文必须得用CHINESE_VGRAM_LEXER类型。要支持一个中文字以上的搜索,必须配置一个WordList,且把它的属性Prefix_Index配置为True。 Oracle Text 不能直接在INTEGER,DATETIME等类型字段上建CTXCAT索引。
CATSEARCH语法本身不支持ABOUT、STEM、FUZZY、NEAR等操作,但是使用了查询模板,这些本来CONTAINS语法才支持的操作都可以在CTXCAT索引上使用了