[原创]关于Oracle Text无法搜索单字的解决方法

最近的项目要做全文搜索,由于时间较紧,就选择了Oracle自带的全文组件OracleText,从定义索引器(CHINESE_VGRAM_LEXER),建立CTXCAT索引,使用CATSEARCH查询一切都很顺利地进行,但是当加上中文分词后总不经意地抛出异常,提示:

  1. ORA-29902:执行ODCIIndexStart() 例行程序中出错;
  2. ORA-20000:Oracle Text Error;
  3. DRG-10847:CATSEARCH 要求这种类型的查询有前缀索引;

抛出异常时的SQL如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
select *
from TableName
where catsearch(ColumnName,'',null> 0

 

但是把搜索关键字的"中"替换为"中国"后,一切都是那么顺利。碰到问题,第一时间就Google去,但是找不到相关的文档说明和解决方案。

Google上找不到(或者还没有找到),只有自己想办法了,既然说在列中没有前缀索引,就从这入手,几经艰辛,终于找到一个为索引建立前缀索引的方法:

  1. 建立索引器使用如下代码:
    ContractedBlock.gif ExpandedBlockStart.gif Code
    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. 建立索引的代码如下:
    ContractedBlock.gif ExpandedBlockStart.gif Code
    Create INDEX indexName on tableName(columnName) indextype is ctxsys.CTXCAT parameters('lexer mydb.chinese_lexer wordlist mydb.chinesewordlist');

再执行上面出错的SQL语句,结果如常!

总结:

  1. OracleText要支持中文必须得用CHINESE_VGRAM_LEXER。
  2. 要支持一个中文字以上的搜索,必须配置一个WordList,且把它的属性Prefix_Index配置为True。
  3. Oracle Text 不能直接在INTEGER,DATETIME等类型字段上建CTXCAT索引。

希望能带给要用OracleText做全文搜索的朋友一点帮助。

转载于:https://www.cnblogs.com/gdut_stu/archive/2009/02/09/1386999.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值