关于Oracle Text无法搜索单字的解决方法
2009-02-10 13:09:06 来源:WEB开发网最近的项目要做全文搜索,由于时间较紧,就选择了Oracle自带的全文组件OracleText,从定义索引器(CHINESE_VGRAM_LEXER),建立CTXCAT索引,使用CATSEARCH查询一切都很顺利地进行,但是当加上中文分词后总不经意地抛出异常,提示:
ORA-29902:执行ODCIIndexStart() 例行程序中出错;
ORA-20000:Oracle Text Error;
DRG-10847:CATSEARCH 要求这种类型的查询有前缀索引;
抛出异常时的SQL如下:
select*
fromTableName
wherecatsearch(ColumnName,'中',null)>0
但是把搜索关键字的"中"替换为"中国"后,一切都是那么顺利。碰到问题,第一时间就Google去,但是找不到相关的文档说明和解决方案。
Google上找不到(或者还没有找到),只有自己想办法了,既然说在列中没有前缀索引,就从这入手,几经艰辛,终于找到一个为索引建立前缀索引的方法:
建立索引器使用如下代码:
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;
建立索引的代码如下:
CreateINDEXindexNameontableName(columnName)indextypeisctxsys.CTXCATparameters('lexermydb.chinese_lexerwordlistmydb.chinesewordlist');
再执行上面出错的SQL语句,结果如常!
总结:
OracleText要支持中文必须得用CHINESE_VGRAM_LEXER。
要支持一个中文字以上的搜索,必须配置一个WordList,且把它的属性Prefix_Index配置为True。
Oracle Text 不能直接在INTEGER,DATETIME等类型字段上建CTXCAT索引。
希望能带给要用OracleText做全文搜索的朋友一点帮助。
- ››oracle 恢复误删除的表和误更新的表
- ››Oracle分页查询排序数据重复问题
- ››Oracle创建dblink报错:ORA-01017、ORA-02063解决
- ››Oracle 提高SQL执行效率的方法
- ››Oracle 动态查询,EXECUTE IMMEDIATE select into...
- ››Oracle 11g必须开启的服务及服务详细介绍
- ››oracle性能34条优化技巧
- ››oracle数据库生成随机数的函数
- ››Oracle 数据库表空间容量调整脚本
- ››oracle单库彻底删除干净的方法
- ››Oracle创建表空间、创建用户以及授权、查看权限
- ››oracle 中 UPDATE nowait 的使用方法
更多精彩
赞助商链接