热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

oracle的全文索引简析

已有几个项目组开始使用oracle的全文索引。Oracle的词法分析器针对ZHS16GBK字符集的词法分析尚不够智能,只能机械地以字为单元进行匹配。对于utf8字符集的数据库有一个新的汉语分析器chinese_lexer,效率有了很大...SyntaxHighlighter.al

已有几个项目组开始使用oracle的全文索引。Oracle的词法分析器针对ZHS16GBK字符集的词法分析尚不够智能,只能机械地以字为单元进行匹配。对于utf8字符集的数据库有一个新的汉语分析器chinese_lexer,效率有了很大改善。现将验证并整理过的如何进行oracle全文索引设置的文档发给大家,适用于8i、9i各平台版本。 
对于DB2,有一个叫做TIE(Text Information Extend)的插件可以实现全文索引,不过据说它的语法分析也很原始。据介绍使用CM(Content Manager)能做到比较好的全文检索,不过需要装一大堆的软件,不适于简单的应用。 
 
一.创建数据库 
 
1、使用dbassist创建数据库时要选择jserver和intermedia两个选项。 
2、检查你的数据库是否安装了intermedia,可以通过检查是否有ctxsys用户和ctxapp角色(role). 
3、如果没有这个用户和角色,意味着数据库创建时未安装intermedia功能。必须修改数据库以安装这项功能。修改过程: 
运行 $ORACLE_HOME/bin/dbassist, 选择'modify database', 然后在选择数据库功能时将jserver 和 intermedia 都选上(安装intermedia必须同时安装jserver).   www.2cto.com  
 
二.设置extproc 
 
Oracle 通过 ‘外部调用功能’(external procedure)来实现intermedia的,因此正确地设置extproc是关键一步。 一般数据库安装完jserver和intermedia后在listener.ora 和tnsnames.ora中已经设置了extproc。 
 
1、测试extproc是否正常 
 
重新启动listener,然后,使用tnsping 来测试一下是否配置正确, 
命令行下运行 
tnsping extproc_connection_data 或者 
tnsping extproc_connection_data.world 
 
如果配置正确,会显示: 
Attempting to contact (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)) OK(140毫秒) 
 
如果正确,可以跳过2、3步骤。否则请按照步骤2、3设置listener.ora 和tnsnames.ora文件,修改后一定要重新启动listener,但并不需要重新启动数据库。 
 
2、设置listerner.ora 
 
如果tnsping失败,需要配置listener 使它能监听intermedia 调用的请求。可以通过运行$ORACLE_HOME/bin/netassit 来进行配置,也可以手工修改配置文件:$ORACLE_HOME/network/admin/listener.ora ,然后重新启动listener。 
 
下面以一个例子来讲述如何手工修改配置文件: 
 
打开listener.ora文件,在修改前,通常有如下内容(假定使用缺省listener): 
LISTENER =   www.2cto.com  
(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) 
)   www.2cto.com  
(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. 
 
3、设置tnsnames.ora 
 
其次,要配置服务器端的tnsnames.ora文件。该文件的位置在$ORACLE_HOME/network/admin下面。同样可以通过运行netasst来进行配置。 
在tnsnames.ora文件中需要增加如下一项: 
EXTPROC_CONNECTION_DATA,EXTPROC_CONNECTION_DATA.WORLD = 
(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) 
)   www.2cto.com  
(CONNECT_DATA = 
(SID = PLSExtProc) 
注意其中,KEY 和SID必须与listener.ora中的key 和sid_name对应相同。 
 
三.设置词法分析器(lexer) 
 
Oracle 缺省使用basic_lexer这个分析器。basic_lexer针对英语。要指定使用中文分析器, 操作步骤: 
 
1. 用ctxsys用户登陆intermedia text manager,口令ctxsys: 
 
2.选择首选项——〉语言指示器——〉创建,输入指示器的名字如chinese_lexer,选择lexer下的chinese_vgrnm_lexer 。 
 
3.建立intermedia索引,指定索引名,选择方案和表下的字段,例如system方案下的DOM_1_DOCLIB中的CURRENTTEXT字段,首选项中选择chinese_lexer 。 
这样建立的全文检索索引,就会使用chinese_vgram_lexer作为分析器。 
 
4.在索引建好后,在该用户下查到Oracle自动产生了以下几个表,可以使用dba studio查看:(假设索引名为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值等。 
 
四.使用job定时同步和优化 
 
在intermedia索引建好后,如果表中的数据发生变化,增加或修改了记录,由于对表所发生的任何dml语句,都不会自动修改索引,因此,必须定时同步(sync)和优化(optimize)索引,以正确反映数据的变化。   www.2cto.com  
 
同步(sync):将新的term 保存到I表; 
优化(optimize):清除I表的垃圾,主要是将已经被删除的term从I表删除。 
 
Oracle提供了一个ctx server来做这个同步和优化的工作,只需要在后台运行这个进程,它会监视数据的变化,及时进行同步。但存在许多问题。可以用下的两个job来完成(该job要建在和表同一个用户下): 
-- sync: 
VARIABLE jobno number; 
BEGIN 
DBMS_JOB.SUBMIT(:jobno,&#39;ctx_ddl.sync_index(&#39;&#39;myindex&#39;&#39;);&#39;, 
SYSDATE, &#39;SYSDATE + (1/24/4)&#39;); 
commit; 
END; 
 
-- optimizer 
VARIABLE jobno number; 
BEGIN 
DBMS_JOB.SUBMIT(:jobno,&#39;ctx_ddl.optimize_index(&#39;&#39;myindex&#39;&#39;,&#39;&#39;FULL&#39;&#39;);&#39;, 
SYSDATE, &#39;SYSDATE + 1&#39;); 
commit;   www.2cto.com  
END; 
 
其中,第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完成。 
 
 
 
作者 z_kanhai

推荐阅读
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文介绍了如何在 DB2 环境中创建和删除数据库编目。创建编目是连接新数据库的必要步骤,涉及获取数据库连接信息、使用命令行工具进行配置,并验证连接的有效性。删除编目则用于移除不再需要的数据库连接。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 梦幻西游挖图奇遇:70级项链意外触发晶清诀,3000W轻松到手
    在梦幻西游中,挖图是一项备受欢迎的活动,无论是小宝图还是高级藏宝图,都吸引了大量玩家参与。通常情况下,小宝图的数量保证了稳定的收益,但特技装备的出现往往能带来意想不到的惊喜。本文讲述了一位玩家通过挖图获得70级晶清项链的故事,最终实现了3000W的游戏币逆袭。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口***测试邮件发送附件*@parammultipartFile*@return*@RequestMappi ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
author-avatar
手机用户2502920725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有