曾妮丽 陈 林
摘 要:全文检索技术是信息管理的关键技术之一, Oracle Text作为Oracle的一个组件, 提供了强大的全文检索功能,用Oracle做后台数据库, 就可以充分利用其全文检索技术, 构建复杂的大型文档管理系统。本文主要介绍了全文检索的原理,Oracle Text全文检索的主要技术及实现。
关键词:Oracle Text 全文检索 索引
一、引言
随着信息技术的飞速发展,各行各业越来越靠信息系统,面对越来越多的数据,如何对信息进行有效组织和检索越来越受到人们的重视。目前各大数据库厂商的数据库版本中都带有全文检索功能,如SQL Server自7.0以后提供了全文检索的功能;Oracle自7.3开始提供文本查询功能。在Oracle8i中,文本检索和媒体管理结合在interMedia中,并且其需要单独安装;从Oracle9i开始,文本检索从interMedia中分离出来,命名为Oracle Text,,在标准和企业级数据库版本中为默认组件不再需要单独的许可。本文主要对Oracle9i的Oracle Text中所涉及的主要技术进行探讨。
二、全文检索技术
1.概念
全文检索就是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立索引,当用户查询时,检索程序就根据事先建立好的索引进行查找,并将查找的结果反馈给用户的检索方式。
2..全文检索系统结构图(如图1)
3.主要技术
全文检索主要由两方面的核心技术结合而实现:一是建立和维护索引库,二是提供快速有效的检索机制。
(1) 文本分析
作为全文检索技术的重要组成部分,中文分词技术和各种常见格式文档的处理方式是研究和应用必然涉及的两个方面。目前使用最为广泛的中文分词方法是词表切分法,这种方法的核心是词表的匹配方法。目前,针对各种格式文档的处理,其主要实现方式是将各种格式文档先转换为某种中间格式,然后对中间格式进行索引和查询。
(2)索引
在中文系统中,基本元素可以是单个汉字字符,也可以是词。因此存在两种基本的索引库结构,即基于字表的索引库和基于词表的索引库。字表法和词表法各有优缺点。前者实用性很强,构建直观方便。检索方面,比较实用的是“首字直接匹配法”。词表法多集中在中文自动分词研究,自然语言统计分析等方面。全文检索中索引的组织方法有两种,即正排表和倒排表。目前通常都采用倒排表进行组织。
索引创建过程不需要排序,分为如下两步。第一步分析源文档,产生临时的中间文件,我们称为分析过程。第二步处理临时文件,依次从临时文件中读取每个字符出现在每一篇文章中的数据信息,生成最终的倒排文件,在这里称为创建过程。生成的最终倒排文件中包含每个字符出现在所有文档中的信息。
(3)检索
从文档的内容上,信息检索有四种传统模型:布尔模型(Boolean Model)、向量空间模型(Vector Space Model,VSM)、概率模型(Probabilistic Model)和逻辑模型(Logic Model)。在四种传统模型的基础上,又演变出了各种其他模型。
三、Oracle Text 全文检索技术及实现
要使用Oracle Text,必须具有CTXAPP角色或者是CTXSYS用户。Oracle Text为系统管理员提供CTXSYS用户,为应用程序开发人员提供CTXAPP角色。CTXSYS用户可执行以下任务:启动Oracle Text服务器,执行CTXAPP角色的所有任务。具有CTXAPP角色的用户可执行以下任务: 创建索引,管理 Oracle Text 数据字典,包括创建和删除首选项,进行Oracle Text 查询,使用 Oracle Text PL/SQL程序包。
以下通过简单的实例从文本装载,索引创建和查询几个方面介绍Oracle Text的全文检索的关键技术。
1.装载文本
Oracle Text默认情况是将文本存储在文本列.列的类型可以是VARCHAR2, CLOB, BLOB, CHAR or BFILE,装载的文本可以是HTML, PDF, Word和纯文本等不同格式.装载文本主要有以下几种模式:
(1) 利用SQL*Loader装载文档
下面以实例进行介绍,将不同格式的文档从操作系统装载到一个BLOB列,需要两个步骤:
首先是创建数据库表
CREATE TABLE articles_formatted (
ARTICLE_IDNUMBER PRIMARY KEY ,
AUTHORVARCHAR2(30),
TEXT BLOB );
然后是发出SQL*Loader命令
使用SQL*Loader需要一个控制文件(设为load.ctl)和装载信息文件(设为load.data).其中load.ctl说明了load.data文件的格式, loader2.data中包含了需要加载的文件的信息.可以使用逗号作为定界符.
Load1.ctl:
Load data
INFILE 'loader2.data'注释:要导入的文件
INTO TABLE articles_formatted 注释:指定装入的表
APPEND注释: 原先的表有数据 就加在后面
FIELDS TERMINATED BY ','注释:以逗号作为定界符(如要装载的数据是”abc,d,e”,在表中结果是”abcde”)
(article_id SEQUENCE (MAX,1), 注释:以下是表的字段, FILLER 关键字 此列的数值不会被装载
author CHAR(30),
ext_fname FILLER CHAR(80),
text LOBFILE(ext_fname) TERMINATED BY EOF)
load2.data:
1,JohnHancock,e:1LoadingMethods.txt,
2,张三,e:1oracle全文检索技术.doc,
3,晓月,e:1全文检索原理及实现.pdf,
然后就可以执行以下命令
sqlldr userid=ctxsys/ctxsys control=load.ctl data=load.data log=load.log
(2)使用DBMS_L OB装载文档
SQL*Loader虽然可以用于批量的装载文档,但是不能将文档文件载入已存在的行内。此时就可以使用DBMS_L0B。这首先需要在数据库中创建一个目录(这要求用户有CREATE ANY DIRECTORY的权限),建立一个你要加载的文件所在目录的别名。然后调用DBMS. FRROMFILE()函数。需要注意的是在进行中文检索时,加载文件之后,还需要将所加载的文件的信息,如:格式、字符集、语言等信息添加到相应的列中。
(3)使用ctxload装载文档
语法格式:
text. . .
col_name:列名
doc_data: 存储在列中的结构化数据
text:被装载的文档内容或文档名称
(4) SQL INSERT 语句
2.索引
Oracle Text的索引在结构上和Oracle中的其他索引完全不同。在创建索引过程中,可以对数据存储,分段器,词法分析器,过滤器,相关词表,停词表或存储首选项等参数进行设置。对于英文的检索,不需要设置首选项,完全使用默认值就可以了。但是对于其他语种文档的检索,则必须进行设置。因为Oracle Text在创建索引时,需要知道该文档的格式、字符集、语种等信息。首选项的设置是通过CTX—DDL包中ctx_dd1.Create_preference和ctx_dd1.Set_attribute过程来进行的。
(1)数据存储(datastore)
数据存储首选项向Oracle通告源数据的组织结构。数据存储参数类型主要有以下几种.
DIRECT_DATASTORE:是默认的数据存储命名,大多数索引操作都使用它DIRECT_DATASTORE:数据被存储在文本列中,文档由详表中的一行或多行组成,头信息存储在主表中
FILE_DATASTORE:数据存储在操作系统的文件系统中,文件名存储在文本列URL_DATASTORE:数据存储在内联网或互联网中的外部文件中,URL存储在文本列中
USER_DATASTORE:通过用户定义的存储过程合成文件.
(2)过滤器(Filter)
通过过滤器,可以不考虑源文档的类型,按照相同的方式将文本加入到索引.可以用以下对象创建过滤器参数。
NULL_FILTER:主要针对存储在文本列的纯文本文件
INSO_FILTER:是能够过滤大部分带格式文件的通用过滤器
USER_FILTER:创建用户自定义的过滤器。
CHARSET_FILTER:能够将文档从一种字符集转换成数据库字符集。
(3)分段器(Sectioner)
分段器从文档标记中分离出文本,文本传递到词法分析器分离出来的是标记符,而把标记保存起来是为了方便分段检索.有了文档段分组,就可以在特别的文档段进行搜索.
(4)词法分析器(Lexer)
标志符产生是查找,分级,分类以及生成文档的主题词或要点的关键词.词法分析器是Oracle生成标志符的方法.其主要包含以下几种类型。
BASIC_LEXER适用于英语和其他单字节语种
CHINESE_VGRAM_LEXER适用于被索引列是英文
MULTI_LEXER被索引列的文档列具有不同的语种.
如果文本列都是一种语言,可以使用一种Lexer设置,但我们检索的文档可能不一定是同一种语言的,所以常常要使用MULTI—LEXER,把索引设置为多种语言。可以设置一种基本检索语言,多种子检索语言。
(5)相关词表(Wordlist)
利用相关词表可以进行模糊检索和词干检索,相关词表只有BASIC_WORDLIST一种类型.
(6)非索引字表(Stoplist)
有些词,如the,of,and加入到索引中是完全没有用的,它对于相关性没有任何帮助,由此Oracle允许添加非索引字表.
如果只是进行普通的检索,设置datastore、FILTER、Lexer三个参数就可以了。下面以匿名存储过程的形式给出了一个示例,设置英语为基本检索语言,简体中文为子检索语言。
begin
ctx_dd1.create_preference(‘My_File_DATASTORE,‘DIRECT_DATASTORE );
ctx_dd1.create_preference(‘My_ENG_Lexer,‘BASIC_LEXER);
ctx_dd1.create_preference(‘My_CHN_Lexer,‘CHINESE_VGRAM_LEXER);
ctx_dd1.create_preference(‘My_Multi_Lexer,‘MULTI_LEXER);
ctx_dd1.add_sub_lexer(‘My_Multi_Lexer,‘ENGLISH,‘My_ENG_Lexer,‘My_Eng);
ctx_dd1.add_sub_lexer(‘My_Multi_Lexer,‘simplified chinese,‘M y_CHN_Lexer,‘M y_Chi);
end;
(7)索引类型及创建
Oracle提供了4种索引类型.CONTEXT索引的功能很强大,也是最常用的类型.创建索引有许多选项,但如果只是英文文档,简单的使用一个create语句就可以了,例如:
create index myindex on articles_formatted(text)indextype is ctxsys.context;
对于其它语言的文档,就需要使用其它的选项。举例说明如下:
create index index_doc on articles_formatted (text)indextype is ctxsys.context parameters(‘datastore My_File_DATASTORE
filterctxsys.inso_filter
charset column charset_col
format column format_col
lexerMy_Multi_Lexer
language column lang);
当加载了新文档或删除文档后,就必须重建索引。有两种方法可以使索引保持同步。一种是ctxgrv程序,另一种方法是手动对索引进行更新:
alter index index—doc rebuild param eters(‘SYNC);
这种方法对于文档列更新不很频繁的情况更为适用。
3..查询处理
索引创建和更新以后,就可以检索了,例如:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'oracle', 1) > 0;
其可以查找到所有包含“oracle”的文档的title,并由score()函数得出Oracle Text对于该文章匹配程度的打分。
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'about(politics)', 1) > 0;
查找包含“politics”主题的所有文档显示其title,并由score()函数得出Oracle Text对于该文章匹配程度的打分。
四、小结
Oracle Text和PL/SQL为关系数据库提供了完备的IR解决方案,使用INSO过滤器,Oracle Text支持150种多种不同文档类型的检索,还可以提取主题词或要点可以高亮度显示关键字和主题词,支持词干技术、模糊查询和通配符查询等,非常便于大型信息检索系统的开发。
参考文献:
[1] Colin McGregor.Oracle8i interMedia Text Reference. http://download.oracle.com/docs/cd/F49540_01/DOC/inter.815/a67843/cdefault.htm.1999,2.
作者简介:曾妮丽,女, 1980年5月生,2002年毕业于南京理工大学,讲师)。