知识大全 在Unix服务器上设置Oracle全文检索
Posted 索引
篇首语:从来没有说忘就忘这回事,只有假装的冷漠和偷偷想念的心。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Unix服务器上设置Oracle全文检索相关的知识,希望对你有一定的参考价值。
在Unix服务器上设置Oracle全文检索 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
由于工作需要 笔者在HP UX Soralis 上面设置了Oracle Intermedia来实现全文检索 目前已经投入实际使用 设置过程中有许多问题和经验 拿来和大家交流 本文依据的是Oracle 和 两个版本 不能保证适用于其他版本
目前全文检索功能几乎所有主流数据库都支持 此前笔者曾在sql server 上实现 感觉非常简单 方便 但创建全文检索索引的时间比较长 通常要十几个小时 Oracle 的全文检索建立和维护索引都要快得多 笔者的 万记录的一个表建立索引只需要 分钟 同步一次只需要 分钟 但设置就要复杂得多
一 设置过程
首先 检查你的数据库是否安装了intermedia
这可以通过检查是否有ctxsys用户和ctxapp角色(role) 如果没有这个用户和角色 意味着你的数据库创建时未安装intermedia功能 你必须修改数据库以安装这项功能
修改过程
运行 $ORACLE_HOME/bin/dbassist 选择 modify database 然后在选择数据库功能时将j server 和 intermedia 都选上(安装intermedia必须同时安装jserver) 强烈建议你在做这个改动前先备份整个数据库
设置extproc
Oracle 是通过所谓的 外部调用功能 (external procedure)来实现intermedia的 因此正确地设置extproc是关键一步
首先要配置listener 使它能监听intermedia 调用的请求 你可以通过运行$ORACLE_HOME/bin/netassit 来进行配置 也可以手工修改配置文件 $ORACLE_HOME/neork/admin/listener ora 然后重新启动listener 下面以一个例子来讲述如何手工修改配置文件
打开listener ora文件 在修改前 通常有如下内容(假定使用缺省listener)
LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = MYDATABASE)(PORT = )) ) SID_LIST_LISTENER = (SID_DESC = (GLOBAL_DBNAME = mydatabase world) (ORACLE_HOME = /u /app/oracle/product/ ) (SID_NAME = mydatabase) )
这个listener还没有配置extproc 因此 需要为它增加对extproc的监听 办法就是分别增加description 和 sid_desc 修改后的listner ora 如下
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = MYDATABASE)(PORT = )) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = mydatabase world) (ORACLE_HOME = /u /app/oracle/product/ ) (SID_NAME = mydatabase) ) (SID_DESC = (PROGRAM = extproc) (SID_NAME = PLSExtProc) (ORACLE_HOME = /u /app/oracle/product/ ) ) )
注意上面的host global_dbname sid_name oracle_home应填写你的数据库的实际值 但program一项必须填写extproc
其次 要配置服务器端的tnsnames ora文件 该文件的位置在$ORACLE_HOME/neork/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( 毫秒)
否则请检查你的上述两个文件 并注意 在修改后一定要重新启动listener 但并不需要重新启动数据库
设置词法分析器(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 这是一个新的汉语分析器 只支持utf 字符集 上面已经看到 chinese vgram lexer这个分析器由于不认识常用的汉语词汇 因此分析的单元非常机械 像上面的 民站 站起 在汉语中根本不会单独出现 因此这种term是没有意义的 反而影响效率 chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇 因此能更有效率地分析句子 像以上两个愚蠢的单元将不会再出现 极大 提高了效率 但是它只支持 utf 如果你的数据库是zhs gbk字符集 则只能使用笨笨的那个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 ntext
parameters( lexer my_lexer )
这样建立的全文检索索引 就会使用chinese_vgram_lexer作为分析器
使用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_RSK $I where rownum<=
这里就不列出查询接过了 可以看到 该表中保存的其实就是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 + ( / / ) ); mit; END; optimizer VARIABLE jobno number; BEGIN DBMS_JOB SUBMIT(:jobno ctx_ddl optimize_index( myindex FULL ); SYSDATE SYSDATE + ); mit; END;
其中 第一个job的SYSDATE + ( / / )是指每隔 分钟同步一次 第二个job的SYSDATE + 是每隔 天做一次全优化 具体的时间间隔 你可以根据自己的应用的需要而定 至此 你的全文检索功能已设置完成
二 常见错误
下面就一些常见的错误信息给出解释和解决办法
sync 失败
DRG ALTER INDEX T_DOC _CT失败
DRG oracle error in drsxsopen
ORA STR 赋值变量缺少空后缀
解决 这是 i的一个bug 但可以避免它 方法是在同步之前先发一个语句
alter session set nls_language=American
create index 失败
ORA 执行 ODCIINDEXCREATE 例行程序时出错
ORA interMedia Text 错误
ORA 在 CTXSYS DRUE line
ORA 在 CTXSYS TEXTINDEXMETHODS line
ORA 在line
解决 这是 之前的版本的一个bug 在处理中文时 某个特殊字符造成的 向Oracle要补丁 或者自己去 下载(需要CSI 号码)
create index 失败
RA 执行 ODCIINDEXCREATE 例行程序时出错
ORA interMedia Text 错误
DRG Net 监听器没有运行或无法启动外部过程
ORA 无法打开与外部过程代理程序的 RPC 连接
ORA 在 CTXSYS DRUE line
ORA 在 CTXSYS TEXTINDEXMETHODS line
ORA 在line
解决 明显的extproc配置不当 仔细阅读本文基本设置的第二步
访问建有索引的表时失败
ora 域索引标记为loading/failed/unusable
解决 这是该表的一个intermedia索引有问题 该索引要么没有正确建立 要么是某次同步失败导致它状态异常 先查到是哪个索引
Select idx_name idx_status from ctxsys ctx_indexes
然后同步该索引或者强制删除它
重建 alter index myindex rebuild online parameters( sync )
删除 drop index myindex force
使用chinese_lexer失败
ERROR at row
ORA err on ODCIINDEXCREATE
ORA interMedia Text err
DRG index is not existing
DRG the lexer cann t analyze as SIMPLIFIED CHINESE_CHINA ZHS GBK
ORA 在 CTXSYS DRUE line
ORA 在 CTXSYS TEXTINDEXMETHODS line
ORA 在line
解决 chinese_lexer 只支持utf 字符集 现在你面临抉择 忍受chinese vgram lexer的愚蠢 或者将数据库字符集改到 utf 但面对可能引起你的应用不能正确处理中文的风险(先咨询Oracle support 并且与你的应用软件提供商联系)
升级或应用patch后失败
ORA err when execute ODCIINDEXDROP
ORA interMedia Texterr
ORA PL/SQL can not find program unit beingcalled
ORA at CTXSYS DRUE line
ORA at CTXSYS TEXTINDEXMETHODS line
ORA at line
解决 这是intermedia的某个object 没有正确产生或者编译 用ctxsys用户登录后 运行 $oracle_home/ctx/admin/dr pkh sql 和 $oracle_home/ctx/admin/dr plb sql 以重新产生所有的package 你也可以直接察看dba_objects视图 找出那些属于ctxsys用户并且status 为invalid的东西 重新产生或者重新编译 (你可能会发现有许多这种东西 不要惊讶 Oracle不会因此而崩溃)
create index 失败
ERROR 位于第 行
ORA 执行 ODCIINDEXCREATE 例行程序时出错
ORA interMedia Text 错误
DRG oracle error in driddl IndexResume
ORA 在尝试分配 字节 (cursor work he QERHJ Bit vector)时进程内存不足
ORA 在 CTXSYS DRUE line
ORA 在 CTXSYS TEXTINDEXMETHODS line
ORA 在line
cha138/Article/program/Oracle/201311/17277相关参考
讲解Oracle数据库的全文索引设置步骤 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Orac
在linux有多种方式可以实现定时运行使用最灵活的应该是crontab 在使用crontab必须特别注意环境变量问题在此以执行oracle的sqlplus为例 说明crontab的使用方法
下面为您介绍的是oracle服务端和客户端之间的网络监听设置如果您在oracle<;服务端和客户端之间的网络监听设置方面遇到过类似的问题不妨一看 oracle服务端和客户端之间的网络监听设
从Unix到Oracle的日期转换 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! CREATEO
UNIX下让ORACLE定时执行*.sql文件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! O
知识大全 UNIX和WINDOWS2000上的ORACLE的差异(1)
UNIX和WINDOWS2000上的ORACLE的差异(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
UNIX设置MySql数据同步实现复制功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! mys
publicclassUnxiTest publicstaticvoidmain(Stringarge[]) Processprocess; try //process=Runtimege
Unix系统环境下设置自动开关数据库的方法[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Unix系统环境下设置自动开关数据库的方法[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!