• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> 数据库 >> Oracle >> 详细内容
 

推荐文章

 
 

热点文章

  • Oracle PL/SQL语言入门
  • Oracle SOA Suite预览尝鲜
  • OracleOracle安全数据系统架构全接触(11
  • Oracle是关系型数据库管理系统,它功能强大、性能卓越..
  • 搭建Oracle高可用数据库环境(1)
  • oracle易忘函数用法(1)
  • 两种Oracle应用程序开发接口的对比分析(1)
  • ORACLE学习笔记--性能优化
  • 诊断Oraacle数据库Hanging问题(1)
  • Oracle中捕获问题SQL解决CPU过渡消耗(1)
  • Oracle数据仓库查询优化技术(1)
  • Oracle常见等待事件说明(1)
 
 

相关文章

  • 实例演示在SQL数据库中启用全文检索
  • 翻出一篇老文章:php文本站内全文检索
 
 

百度搜索

 
 

在UNIX服务器上设置Oracle8i全文检索(1)

  • 阅览次数:
  • 文章来源: cp整理
  • 原文作者: 不详
  • 整理日期: 2007-03-27
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

3.设置词法分析器(lexer) 

Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term) 找出来,记录在一组 以 dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的 term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle 针对不同的语言提供了不同的 lexer, 而我们通常能用到其中的三个: 

basic_lexer: 针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。 

chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集。该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。 

chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大 提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer. 



如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器。要指定使用哪一个lexer, 可以这样操作: 

第一.在ctxsys用户下建立一个preference: 

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



第二.在建立intermedia索引时,指明所用的lexer: 

create index myindex on mytable(mycolumn) indextype is ctxsys.context  

parameters('lexer my_lexer'); 



这样建立的全文检索索引,就会使用chinese_vgram_lexer作为分析器。 



4.使用job定时同步和优化 

在intermedia索引建好后,如果表中的数据发生变化,比如增加或修改了记录,怎么办?由于对表所发生的任何dml语句,都不会自动修改索引,因此,必须定时同步(sync)和优化(optimize)索引,以正确反映数据的变化。 

在索引建好后,我们可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex): 

DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N 

其中以I表最重要,可以查询一下该表,看看有什么内容: 

select token_text, token_count from DR$I_RSK1$I where rownum<=20; 

这里就不列出查询接过了。可以看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里,包括term出现的位置、次数、hash值等。当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表)。那么如何维护该表的内容呢?总不能每次数据改变都重新建立索引吧!这就用到sync 和 optimize了。 

同步(sync):将新的term 保存到I表; 

优化(optimize):清除I表的垃圾,主要是将已经被删除的term从I表删除。 



Oracle提供了一个所谓的ctx server来做这个同步和优化的工作,只需要在后台运行这个进程,它会监视数据的变化,及时进行同步。但笔者使用ctxserver碰到了许多问题,Oracle 北京的support也建议不使用,而是用以下的两个job来完成(该job要建在和表同一个用户下): 

-- sync: 

VARIABLE jobno number; 

BEGIN 

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');', 

SYSDATE, 'SYSDATE + (1/24/4)'); 

commit; 

END; 



-- optimizer 

VARIABLE jobno number; 

BEGIN 

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');', 

SYSDATE, 'SYSDATE + 1'); 

commit; 

END; 

其中, 第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完成。 



二、常见错误 

下面就一些常见的错误信息给出解释和解决办法: 

1, sync 失败 

DRG-10595: ALTER INDEX T_DOC6_CT失败 

DRG-50857: oracle error in drsxsopen 

ORA-01480: STR 赋值变量缺少空后缀 



解决:这是8i的一个bug, 但可以避免它,方法是在同步之前先发一个语句: 

alter session set nls_language=American;  

[1] [2] [3]

上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号