Oracle9i的全文检索技术

2016-02-19 20:18 3 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐Oracle9i的全文检索技术,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

  1 Oracle Text的体系架构

  下图是Oracle Text的体系架构。


图1 Oracle Text的体系架构

  以上面的体系架构图为基础,Oracle Text 索引文档时所使用的主要逻辑步骤如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  (1)数据存储逻辑搜索表的所有行,并读取列中的数据。通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。例如,URL_DATASTORE 将列数据作为 URL 使用。

  (2)过滤器提取文档数据并将其转换为文本表示方式。存储二进制文档 (如 Word 或 Acrobat 文件) 时需要这样做。过滤器的输出不必是纯文本格式 -- 它可以是 XML 或 HTML 之类的文本格式。

  (3)分段器提取过滤器的输出信息,并将其转换为纯文本。包括 XML 和 HTML 在内的不同文本格式有不同的分段器。转换为纯文本涉及检测重要文档段标记、移去不可见的信息和文本重新格式化。

  (4)词法分析器提取分段器中的纯文本,并将其拆分为不连续的标记。既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。

  (5)索引引擎提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。倒排索引存储标记和含有这些标记的文档。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  2 简单的示例

  这里先给出一个简单示例说利用Oracle Text实现全文检索的方法与步骤,在后面在进行具体的说明。Orcale9i提供了Oracle Text Manager可以简化许多工作,所有在Oracle Text Manager中完成的工作,都可以在通过PL/SQL来实现。要使用Oracle Text,必须具有CTXAPP角色或者是CTXSYS用户。Oracle Text为系统管理员提供CTXSYS用户,为应用程序开发人员提供CTXAPP角色。

  CTXSYS用户可执行以下任务:启动Oracle Text服务器,执行CTXAPP角色的所有任务。
具有CTXAPP角色的用户可执行以下任务: 创建索引,管理 Oracle Text 数据字典,包括创建和删除首选项,进行Oracle Text 查询,使用 Oracle Text PL/SQL程序包。

  使用Oracle Text的步骤:

  (1)创建表来保存某些文档。该示例使用一个主关键字列来标识每个文档,使用一个小的VARCHAR2列来保存每个文档。

CREATE TABLE docs (id NUMBER PRIMARY KEY, text VACHAR2(80));

  (2)将两个示例文档置入该表:

INSERT INTO docs VALUES (1,'the first doc');
INSERT INTO docs VALUES (2,'the second doc');
COMMIT;

  (3)使用Oracle Text Manager来创建和修改首选项,首选项将与索引相关联。

  (4)使用Oracle Text Manager创建文本索引。另外,可以输入以下使用默认首选项的 SQL 语句:

CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;

  (5)使用 CONTAINS 函数,发出基于内容的文档查询。例如:

SELECT id FROM docs WHERE CONTAINS (text, 'first') 0;

  这将在文本列包含单词 first (即文档1) 的 docs 中查找所有行。语句中的0部分是有效的Oracle SQL所必需的,Oracle SQL不支持函数的布尔返回值。

  以上只是一个简单的示例,旨在给出使用Oracle Text建立全文索引的完整步骤,归纳起来如下:

  (1)建表并装载文本(包含带有需要检索的文本字段)

  (2)配置索引

  (3)建立索引

  (4)发出查询

  (5)索引维护:同步与优化(将在后面介绍)

  3 文本装载

  要实现文本的全文检索首先必须把正确的文本加载到数据库表中,默认的建立索引行为要求将文档装载在文本列中,尽管可以用其它方式 (包括文件系统和 URL 形式)存储文档 (在"数据存储"选项进行设置)。默认情况下,系统应该将文档装载在文本列中。文本列可以是VARCHAR2、CLOB、BLOB、CHAR或BFILE。注意,只有在将Oracle7系统移植到Oracle8的情况下才支持用LONG和LONG RAW 这两个相反的列类型存储文本。不能为列类型NCLOB、DATE和NUMBER建立索引。

  关于文档格式,因为系统能为包括HTML、PDF、Microsoft Word和纯文本在内的大多数文档格式建立索引,可以将其中的任何文档类型装载到文本列中(在"过滤器"选项中设置)。有关所支持的文档格式的详细信息,可以参阅Oracle Text User's Guide and Reference 中的附录"Supported Filter Formats"。

  装载方法主要有以下几种:

  (1)SQL INSERT 语句

  (2)ctxload 可执行文件

  (3)SQL*Loader

  (4)从 BFILE 中装载 LOB 的 DBMS_LOB.LOADFROMFILE() PL/SQL 过程

  (5)Oracle Call Interface

  6 显示满足查询条件的文档

  通常,通过使用Oracle Text查询应用程序,用户可查看查询所返回的文档。用户从命中列表中选择一个文档,然后应用程序以某种形式显示该文档。通过Oracle Text,可以用不同的方式再现文档。例如,可以通过突出显示查询词来显示文档。突出显示的查询词可以是相关词查询中的词,也可以是英文 ABOUT 查询中的主题词。

  以下是关于输出效果和用于每个输出效果的过程的信息:

  突出显示的文档,纯文本格式版本(CTX_DOC.MARKUP)

  突出显示的文档,HTML版本(CTX_DOC.MARKUP)

  突出显示纯文本格式版本的偏移量信息(CTX_DOC.HIGHLIGHT)

  突出显示HTML 版本的偏移量信息(CTX_DOC.HIGHLIGHT)

  纯文本格式版本,无突出显示(CTX_DOC.FILTER)

  HTML版本文档,无突出显示(CTX_DOC.FILTER)

  7 索引维护

  索引建好后,如果表中的数据发生变化,比如增加或修改了记录,怎么办?由于对表所发生的任何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$ myindex $I where rownum=20;

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

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

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

  Oracle提供了一个所谓的ctx server来做这个同步和优化的工作,只需要在后台运行这个进程,它会监视数据的变化,及时进行同步。另外,也可以用以下的job来完成(该job要建在和表同一个用户下):

create or replace procedure sync
is
begin
execute immediate
'alter index myindex rebuild online' ||
' parameters ( ''sync'' )' ;
execute immediate
'alter index myindex rebuild online' ||
' parameters ( ''optimize full maxtime unlimited'' )' ;
end sync;
/

Set ServerOutput on
declare
v_job number;
begin
Dbms_Job.Submit
(
job = v_job,
what = 'sync;',
next_date = sysdate, /* default */
interval = 'sysdate + 1/720' /* = 1 day / ( 24 hrs * 30 min) = 2 mins */
);
Dbms_Job.Run ( v_job );
Dbms_Output.Put_Line ( 'Submitted as job # ' || to_char ( v_job ) );
end;
/

  job的SYSDATE + (1/720)是指每隔2分钟同步一次。具体的时间间隔,可以根据自己的应用的需要而定。

  8 小结

  文本对于各种规模的公司、机构组织来说,都是包含众多丰富信息的最有效载体,Oracle Text的推出,标志着Oracle提供了一套崭新的技术,可以便捷安全的用于管理企业的文本信息。Oracle Text使应用程序开发者可以透明地将全文检索能力加入到基于SQL的应用程序中,Oracle Text也是其他Oracle产品的核心组件,比如Oracle9iAS Portal,Oracle eBusiness Suite,Oracle Ultra Search和Oracle Internet File System等。灵活运用Oracle Text提供的全文检索技术,就可以使自己的应用具备强大的全文检索能力。

来源:https://www.tulaoshi.com/n/20160219/1623314.html

延伸阅读
正在看的ORACLE教程是:Oracle9i取得建表和索引的DDL语句。我们都知道在9i之前,要想获得建表和索引的语句是一件很麻烦的事。我们通常的做法都是通过export with rows=no来得到,但它的输出因为格式的问题并不能直接拿来用。而另一种方法就是写复杂的脚本来查询数据字典,但这对于一稍微复杂的对象,如IOT和嵌套表等,还是无法查到。&n...
Oracle数据库的9.2.0.1.0版本中的Oracle HTTP Server有如下变化: 一、关于Apache Jserv进程 Oracle HTTP Server支持的Apache Jserv进程的最大数目已经从Apache发布的缺省值最大值25增加到最大值128,这个值是不可实时配置的。 二、JDK/JRE 认证 Oracle被认证使用JDK/JRE 1.3.1_01和JDK/JRE 1.2.2_07两者来建立和配置...
标签: 电脑入门
1、切换服务器归档模式,如果已经是归档模式可跳过此步: %sqlplus /nolog (启动sqlplus) SQL conn / as sysdba (以DBA身份连接数据库) SQL shutdown immediate; (立即关闭数据库) SQL startup mount (启动实例并加载数据库,但不打开) SQL alter database archivelog; (更改数据库为归档模式) SQL alter databa...
环境:WindowsXP 数据库:Oracle9i 问题一: 第一次在WindowsXP上安装Oracle9i就碰到如下错误: 您可能没有建立目录的适当权限或者磁盘已经没有空间,无法建立目录 c:.... 当时我的c盘有4G空间,天哪!这是错误吗?经过仔细分析,我觉得临时文件夹路径太长了,曾经通过网络安装Oracle8i时好像碰到过这样的错误。...
近来,浏览BBS时,常看到急急急!如何启动OMS?的字眼,就针对以上这类问题,我有些经验想和大家共同分享。 能否正常启动OEM或OMS关键有以下两点: 第一.Oracle的系统服务是否开启; 第二.登录时用的用户名和口令是否正确。 那么先针对第一点谈谈Oracle的系统服务。在完全安装的情况下,Oracle的系统服务共有11项: ...

经验教程

44

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部