如何解决Oracle Text无法搜索单字的问题

原创|其它|编辑:郝浩|2009-12-30 10:15:49.000|阅读 542 次

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

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  最近的项目要做全文搜索,由于时间较紧,就选择了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做全文搜索的朋友一点帮助。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP