Oracle 全文索引功能实现

发表于:2009-9-14 10:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

#
Oracle

  前言:数据库工程师众所周知的一个事实是,当对数据库里的文本字段进行like检索的时候,任何数据索引都是不起作用的,这样也就导致系统会承担额外的开销和负载压力,对于庞大的数据记录,对其中的文本字段进行关键字匹配,就肯定会存在非常严重的效率障碍和性能障碍。因此,基于文本的全文索引技术也就逐渐兴起。

  全文索引的技术原理并不复杂,对段落性的文本内容进行逐词分解,并针对词出现频率,出现位置进行标记,按照词本身的编码顺序存储为索引文件。这样,在针对关键词进行检索的时候,就不会遍历所有的文本数据记录,而是根据索引文件进行有序查找,这里面一个显见的事实是,通过有序索引查找关键词,对于海量的数据记录而言,也只需要很少次数的指针跳转,(数量为X的索引记录,查询特定记录的指针跳转次数最多为Log2(x)。)即可完成搜索,而无须完整遍历整个数据表或文件集。

  但是全文索引技术的实现却并不简单,针对中文的尤其如此,英文文本中,空格是天然的分词标记,而中文段落却无法通过这样简单的途径分词,因此基于常用语词典和一些语言识别规则的分词技术成为一种非常高的技术门槛,幸好,很多商业公司提供了非常成熟的商业产品,使我等可以坐享其成,快速搭建全文搜索的平台。

  ORACLE INTERMEDIA介绍

  ORACLE Intermedia是ORACLE公司官方发布的用来管理多媒体数据的数据库管理模块,通过它可以进行有效的视频,音频,图片等文件的统一存储,调用和相关处理;同时其中也包括一个Oracle Intermdedia Text功能模块,能够对多种格式文档进行分词索引处理,也提供了使用自然语法或高级查询方法进行跨文本查询的途径,可以查询word, PDF,RTF等格式的文件和数据。

  Oracle Intermedia 的索引效率和查询效率,据一些公开数据上看要远高于Microsoft的Index Server,而且本身具有平台无关特性,另外作为数据库产品,可以很好的和数据库应用进行整合,这一点也是纯粹的文件索引系统所无法实现的。当然,作为通用的数据库产品,Oracle不可能针对全文索引做到最大限度的优化,因此对于高并发大容量的搜索引擎应用,Oracle的方案可能就无法满足,这一点也是必须提前声明的。

  全文索引实现步骤

  步骤1:查看Oracle Intermedia是否正确安装。Oracle Intermdeia是Oracle的一个附带模块,安装过程中选择即可。

  步骤2:设置词法解析器

  oracle根据不同语言,有不同的词法解析器,以下说明我们可能用到的三个

  basic_lexer,针对英语环境,以空格为分词标记,同时能分辨一些“噪音”单词,如 “if”, “is”等。

  chinese_vgram_lexer,专用的汉语分析器,按字为单元分析中文,算法简单,可以一网打尽中文用词,但是效率差强人意。

  chinese_lexer,可以识别大部分常用短语和词汇,不会产生大量冗余数据,有很好的实用性,但是语言支持只能为UTF-8编码,不支持zhs16gbk字符集。

  以ctxsys用户登陆系统,执行:

  begin ctx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end;

  这里假设我们的语法解析器命名为my_lexer,这个名称也可以根据实际应用变化。

  步骤3:建立索引字段

  我的测试用例保存在system空间,表名为my_docs,字段名为doc,字段类型为blob,存储标准word doc文件。

  仍旧保持ctxsys帐户登陆,执行如下操作

  create index system.myindex on system.my_docs(doc) indextype is ctxsys.context parameters(‘lexer’,’my_lexer’) ;

  步骤4:同步操作(sync)及优化操作

  以system 登陆,同步操作执行

  exec ctx_ddl.sync_index('myindex');

  创建同步定时任务代码如下:

VARIABLE jobno number;
BEGIN
  DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');',
  SYSDATE, 'SYSDATE + (1/24/4)');
  commit;
  END;
/

  以system登陆,优化索引操作执行

  exec ctx_ddl.optimize_index('myindex','FULL');

  创建优化定时任务代码如下:

VARIABLE jobno number;
  BEGIN
  DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');',
  SYSDATE, 'SYSDATE + 1');
  commit;
  END;
/

  步骤5:测试

  select id from my_docs where contains(doc,'关键字')>0

  总结:

  该学习笔记内容大部分可以通过搜索引擎找到,并非本人原创内容,本文全部经个人在windows平台下,在oracle 9i下测试完成,留档记录,为日后的项目和产品开发做技术准备。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号