大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 数据库 -> 在UNIX服务器上设置Oracle8i全文检索

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

时间: 2021-07-31 作者:daque

因为处事须要,笔者在hp ux, soralis 上头树立了oracle intermedia来实行全文字笔迹检验索。暂时仍旧加入本质运用。树立进程中有很多题目和体味,拿来和大师交谈。正文按照的是oracle 8.1.6 和8.1.7两个本子,不许保护实用于其余本子。 暂时全文字笔迹检验索功效简直一切合流数据库都扶助。此前笔者曾在sql server 2000上实行,发觉特殊大略,简单,但创造全文字笔迹检验索索引的功夫比拟长,常常要十几个钟点。oracle 的全文字笔迹检验索创造和保护索引都要快得多,笔者的65万记载的一个表创造索引只须要20秒钟,同步一次只须要1秒钟。但树立就要搀杂得多。 一.树立进程 1.开始,查看你的数据库能否安置了intermedia 这不妨经过查看能否有ctxsys用户和ctxapp脚色(role). 即使没有这个用户和脚色,表示着你的数据库创造时未安置intermedia功效。你必需窜改数据库以安置这项功效。 窜改进程: 运转 $oracle_home/bin/dbassist, 采用'modify database', 而后在采用数据库功效时将j server 和 intermedia 都选上(安置intermedia必需同声安置jserver).激烈倡导你在做这个变换前先备份所有数据库。  2.树立extproc oracle 是经过所谓的‘外部调用工能’(external procedure)来实行intermedia的,所以精确地树立extproc是要害一步。 开始要摆设listener 使它能监听intermedia 挪用的乞求。你不妨经过运转$oracle_home/bin/netassit 来举行摆设,也不妨细工窜改摆设文献:$oracle_home/network/admin/listener.ora ,而后从新启用listener。底下以一个例子来报告怎样细工窜改摆设文献。 翻开listener.ora文献,在窜改前,常常犹如下实质(假设运用缺省listener): listener = (description = (address = (protocol = tcp)(host = mydatabase)(port = 1521)) )  sid_list_listener = (sid_desc = (global_dbname = mydatabase.world) (oracle_home = /u01/app/oracle/product/8.1.6) (sid_name = mydatabase) )  这个listener还没有摆设extproc, 所以,须要为它减少对extproc的监听,方法即是辨别减少description 和 sid_desc. 窜改后的listner.ora 如次: listener = (description_list = (description = (address = (protocol = tcp)(host = mydatabase)(port = 1521)) ) (description = (address = (protocol = ipc)(key = extproc))  ) ) sid_list_listener = (sid_list = (sid_desc = (global_dbname = mydatabase.world) (oracle_home = /u01/app/oracle/product/8.1.6) (sid_name = mydatabase) ) (sid_desc = (program = extproc) (sid_name = plsextproc) (oracle_home = /u01/app/oracle/product/8.1.6) ) )  提防上头的host, global_dbname,sid_name,oracle_home应填写你的数据库的本质值,但program一项必需填写extproc. 其次,要摆设效劳器端的tnsnames.ora文献。该文献的场所在$oracle_home/network/admin底下。同样不妨经过运转netasst来举行摆设。 在tnsnames.ora文献中须要减少如次一项: extproc_connection_data,extproc_connection_data.world = (description = (address_list = (address = (protocol = ipc)(key = extproc)) ) (connect_data = (sid = plsextproc) ) ) 提防个中,key 和sid必需与listener.ora中的key 和sid_name对应沟通。 窜改实行后,从新启用listener (先用lsnrctl stop, 而后 lsnrctl start), 而后,运用tnsping 来尝试一下能否摆设精确: tnsping extproc_connection_data 大概 tnsping extproc_connection_data.world,即使摆设精确,会表露: attempting to contact (address=(protocol=ipc)(key=extproc)) ok(140毫秒) 要不请查看你的上述两个文献,并提防,在窜改后确定要从新启用listener,但并不须要从新启用数据库。  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;  2.create index 波折 ora-29855: 实行 odciindexcreate 例路途序时堕落 ora-20000: intermedia text 缺点: ora-06512: 在"ctxsys.drue", line 126 ora-06512: 在"ctxsys.textindexmethods", line 54 ora-06512: 在line 1  处置:这是8.1.6.3之前的本子的一个bug, 在处置华文时,某个特出字符形成的。向oracle要补丁,大概本人去metalink.oracle.com 载入(须要csi 号子)。  3.create index 波折 ra-29855: 实行 odciindexcreate 例路途序时堕落 ora-20000: intermedia text 缺点: drg-50704: net8 监听器没有运转或没辙启用外部进程 ora-28575: 没辙翻开与外部进程代劳步调的 rpc 贯穿 ora-06512: 在"ctxsys.drue", line 126 ora-06512: 在"ctxsys.textindexmethods", line 54 ora-06512: 在line 1  处置:鲜明的extproc摆设不妥。提防观赏正文基础树立的第二步。  4.考察建有索引的表时波折 ora-29861: 域索引标志为loading/failed/unusable  处置:这是该表的一个intermedia索引有题目,该索引要么没有精确创造,要么是某次同步波折引导它状况特殊。先查到是哪个索引: select idx_name,idx_status from ctxsys.ctx_indexes; 而后同步该索引大概强迫简略它: 重修:alter index myindex rebuild online parameters('sync'); 简略:drop index myindex force;  5.运用chinese_lexer波折 error at row 1: ora-29855: err on odciindexcreate  ora-20000: intermedia text err: drg-10502: index 1386 is not existing. drg-11102: the lexer cann't analyze as simplified chinese_china.zhs16gbk ora-06512: 在"ctxsys.drue", line 126 ora-06512: 在"ctxsys.textindexmethods", line 54 ora-06512: 在line 1 处置:chinese_lexer 只扶助utf8字符集。此刻你面对决定:忍耐chinese vgram lexer的笨拙,大概将数据库字符集改到 utf8, 但面临大概惹起你的运用不许精确处置华文的危害(先接洽oracle support, 而且与你的运用软硬件供给商接洽)。  6.晋级或运用patch后波折 ora-29856: err when execute odciindexdrop ora-20000: intermedia texterr ora-06508: pl/sql: can not find program unit beingcalled ora-06512: at "ctxsys.drue", line 126 ora-06512: at"ctxsys.textindexmethods", line 229 ora-06512: at line 1  处置:这是intermedia的某个object 没有精确爆发大概编写翻译。用ctxsys用户登录后,运转 $oracle_home/ctx/admin/dr0pkh.sql 和 $oracle_home/ctx/admin/dr0plb.sql 以从新爆发一切的package.你也不妨径直查看dba_objects视图,找到那些属于ctxsys用户而且status 为invalid的货色,从新爆发大概从新编写翻译。(你大概会创造有很多这种货色,不要诧异,oracle不会所以而解体)。  7.create index 波折 error 坐落第 1 行: ora-29855: 实行 odciindexcreate 例路途序时堕落 ora-20000: intermedia text 缺点: drg-50857: oracle error in driddl.indexresume ora-04030: 在试验调配 524288 字节 (cursor work he,qerhj bit vector)时过程外存不及 ora-06512: 在"ctxsys.drue", line 126 ora-06512: 在"ctxsys.textindexmethods", line 214 ora-06512: 在line 1  处置:惹起这个题目不妨有多种因为,开始你不妨将sort_area_size这个参数减小到不多于2m,这不妨提防oracle在创造索引时间配太多的sort 外存而耗尽资源。 但即使这不起效率,并且你是8.1.7, 则祝贺,你hit 了bug 1391737. 该bug 在你要建索引的字段,即使某条记载的长度胜过2000字符时惹起oracle耗尽外存资源。别无它法,除去打 8.1.7.1b 的补丁。  oracle intermedia 的运用再有很多充分的话题,比方它那24个操纵符、字典等。有功夫咱们连接再谈。 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.