`
z_kanhai
  • 浏览: 50971 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle的全文索引

阅读更多
已有几个项目组开始使用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).

二.设置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 =
(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.

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))
)
(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)索引,以正确反映数据的变化。

同步(sync):将新的term 保存到I表;
优化(optimize):清除I表的垃圾,主要是将已经被删除的term从I表删除。

Oracle提供了一个ctx server来做这个同步和优化的工作,只需要在后台运行这个进程,它会监视数据的变化,及时进行同步。但存在许多问题。可以用下的两个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天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完成。
分享到:
评论

相关推荐

    ORacle 全文索引

    Oracle全文索引是Oracle数据库系统中的一个重要特性,它允许用户对数据库中的文本数据进行高效的全文搜索。全文索引使得在海量文本数据中查找特定词汇或短语变得快速且简便,对于那些需要处理大量文本信息的应用程序...

    《Oracle_全文索引_详细介绍》_40页.pdf

    ### Oracle全文索引详解 #### 一、Oracle全文索引概述 Oracle全文索引是一种特殊类型的索引,它主要用于提高基于文本的查询性能。自从Oracle 7.3版本开始引入了这一特性,允许用户通过Oracle服务器提供的上下文...

    Oracle全文索引培训教材

    Oracle全文索引培训教材,内容详细,从原理到细节的深度剖析!

    oracle 全文检索 全文索引 多列字段索引

    oracle 全文检索 oracle全文索引 多列字段检索,匹配多列字段搜索功能。

    Oracle自带全文索引

    在使用Oracle全文索引之前,需要进行一些必要的准备工作。首先,检查数据库是否已经存在`ctxsys`用户,因为全文索引的功能是基于这个特定的系统用户提供的。如果数据库没有这个用户,需要手动安装。安装过程包括创建...

    Oracle 全文检索的使用及内部机制

    1. 如何创建和使用全文索引, 文中包含详细的步骤 2. 当数据发生变化时,如何更新全文索引,并且如何通过Job实现自动化 3. 数据如何设计才能让全文索引查询更精确 4. 全文索引的实现原理 5. 常见问题及解决方法 6. 如何...

    oracle全文检索

    Oracle全文检索技术是数据库管理系统Oracle中用于高效查找和分析文本数据的一种功能。它在不同的Oracle版本中有着不同的名称,如Oracle8.0.x中的ConText,Oracle8i中的interMedia Text,以及从Oracle9i开始的Oracle ...

    oracle10g全文索引自动同步语句使用方法

    Oracle10g中context类型的全文索引也可以自动同步了。10g中新引入了2种同步的方式,现在有3种 1、ctx_ddl.sync_index2、sync(on commit)3、sync( every …) in parameter setting while creating index sync(on ...

    详解Oracle数据库中文全文索引.docx

    "Oracle数据库中文全文索引" Oracle数据库中文全文索引是Oracle数据库的一种功能强大的文本检索技术,通过使用Oracle Text,使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力。Oracle Text是Oracle9i采用...

    ORACLE索引详解及SQL优化

    3. **操作符**:某些操作符如`NOT`、`BETWEEN`、`LIKE`的模糊匹配可能导致索引失效,除非使用了前缀索引或全文索引。 4. **索引选择性**:索引的选择性越高,区分度越大,使用索引的效果越好。如果索引列的值过于...

    详解Oracle数据库中文全文索引

    ### 详解Oracle数据库中文全文索引 Oracle数据库的全文检索技术已经非常成熟和完善,其中Oracle Text使得Oracle 9i具备了强大的文本检索能力和智能化的文本管理能力。在不同的Oracle版本中,这一技术有着不同的名称...

    Oracle数据库全文索引查询模板的使用

    Oracle数据库全文索引查询模板是优化全文搜索的关键特性,它允许开发者在CONTEXT和CTXCAT索引上使用特定的查询语法,以实现更复杂的文本检索功能。在Oracle中,全文索引主要用于提高对文本数据的搜索效率,特别是...

    oracle全文检索的实现

    ### Oracle全文检索技术详解 #### 引言 随着信息技术的发展,数据处理的需求日益增长,特别是对于文本信息的高效检索需求愈发显著。Oracle数据库,作为业界领先的关系型数据库管理系统之一,自Oracle9i Release 2...

    Oracle查询优化技术在标准化服务平台中的应用.pdf

    通过建立Oracle全文索引,系统能够快速匹配和检索含有特定词汇的记录,大大缩短了查询时间,提升了用户查询效率。全文索引利用了高级文本分析技术,能够处理复杂的查询语句,并且支持模糊匹配,适用于标准信息库等...

    oracle 全文检索实现

    Oracle 全文检索实现的总体架构图由五个部分组成:XML 配置文件、读取器、索引器、索引库和检索器。其中,XML 配置文件存储数据库的配置信息,包括需要全文检索的表名和列名。读取器读取 XML 配置文件中的信息,并...

Global site tag (gtag.js) - Google Analytics