Oracle一直致力于全文检索技术的研究当Oraclei Rlease发布之时Oracle数据库的全文检索技术已经非常完美Oracle Text使Oraclei具备了强大的文本检索能力和智能化的文本管理能力Oracle Text是Oraclei采用的新名称在Oracle/i中它被称作Oracle interMedia Text在Oracle以前它的名称是Oracle ConText Cartridge使用Oraclei和Oracle Text可以方便而有效地利用标准的SQL工具来构建基于文本的新的开发工具或对现有应用程序进行扩展应用程序开发人员可以在任何使用文本的Oracle数据库应用程序中充分利用Oracle Text搜索应用范围可以是现有应用程序中可搜索的注释字段也可是实现涉及多种文档格式和复杂搜索标准的大型文档管理系统Oracle Text支持Oracle数据库所支持的大多数语言的基本全文搜索功能本文将介绍如何使用Oraclei的全文检索技术来为自己的应用提供一个优秀的解决方案
Oracle Text的体系架构
下图是Oracle Text的体系架构
图 Oracle Text的体系架构以上面的体系架构图为基础Oracle Text 索引文档时所使用的主要逻辑步骤如下
()数据存储逻辑搜索表的所有行并读取列中的数据通常这只是列数据但有些数据存储使用列数据作为文档数据的指针例如URL_DATASTORE 将列数据作为 URL 使用
()过滤器提取文档数据并将其转换为文本表示方式存储二进制文档 (如 Word 或 Acrobat 文件) 时需要这样做过滤器的输出不必是纯文本格式 它可以是 XML 或 HTML 之类的文本格式
()分段器提取过滤器的输出信息并将其转换为纯文本包括 XML 和 HTML 在内的不同文本格式有不同的分段器转换为纯文本涉及检测重要文档段标记移去不可见的信息和文本重新格式化
()词法分析器提取分段器中的纯文本并将其拆分为不连续的标记既存在空白字符分隔语言使用的词法分析器也存在分段复杂的亚洲语言使用的专门词法分析器
()索引引擎提取词法分析器中的所有标记文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表并构建反向索引倒排索引存储标记和含有这些标记的文档
简单的示例
这里先给出一个简单示例说利用Oracle Text实现全文检索的方法与步骤在后面在进行具体的说明Orcalei提供了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的步骤
()创建表来保存某些文档该示例使用一个主关键字列来标识每个文档使用一个小的VARCHAR列来保存每个文档
CREATE TABLE docs (id NUMBER PRIMARY KEY text VACHAR());
()将两个示例文档置入该表
INSERT INTO docs VALUES (the first doc)
INSERT INTO docs VALUES (the second doc)
COMMIT
()使用Oracle Text Manager来创建和修改首选项首选项将与索引相关联
()使用Oracle Text Manager创建文本索引另外可以输入以下使用默认首选项的 SQL 语句
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYSCONTEXT;
()使用 CONTAINS 函数发出基于内容的文档查询例如
SELECT id FROM docs WHERE CONTAINS (text first) > ;
这将在文本列包含单词 first (即文档) 的 docs 中查找所有行语句中的>部分是有效的Oracle SQL所必需的Oracle SQL不支持函数的布尔返回值
以上只是一个简单的示例旨在给出使用Oracle Text建立全文索引的完整步骤归纳起来如下
()建表并装载文本(包含带有需要检索的文本字段)
()配置索引
()建立索引
()发出查询
()索引维护同步与优化(将在后面介绍)
文本装载
要实现文本的全文检索首先必须把正确的文本加载到数据库表中默认的建立索引行为要求将文档装载在文本列中尽管可以用其它方式 (包括文件系统和 URL 形式)存储文档 (在数据存储选项进行设置)默认情况下系统应该将文档装载在文本列中文本列可以是VARCHARCLOBBLOBCHAR或BFILE注意只有在将Oracle系统移植到Oracle的情况下才支持用LONG和LONG RAW 这两个相反的列类型存储文本不能为列类型NCLOBDATE和NUMBER建立索引
关于文档格式因为系统能为包括HTMLPDFMicrosoft Word和纯文本在内的大多数文档格式建立索引可以将其中的任何文档类型装载到文本列中(在过滤器选项中设置)有关所支持的文档格式的详细信息可以参阅Oracle Text Users Guide and Reference 中的附录Supported Filter Formats
装载方法主要有以下几种
()SQL INSERT 语句
()ctxload 可执行文件
()SQL*Loader
()从 BFILE 中装载 LOB 的 DBMS_LOBLOADFROMFILE() PL/SQL 过程
()Oracle Call Interface
为文本建立索引
文本装入文本列后就可以创建Oracle Text索引文档以许多不同方案格式和语言存储因此每个 Oracle Text 索引有许多需要设置的选项以针对特定情况配置索引创建索引时Oracle Text可使用若干个默认值但在大多数情况下要求用户通过指定首选项来配置索引
每个索引的许多选项组成功能组称为类每个类集中体现配置的某一方面可以认为这些类就是与文档数据库有关的一些问题例如数据存储过滤器词法分析器相关词表存储等
每个类具有许多预定义的行为称之为对象每个对象是类问题可能具有的答案并且大多数对象都包含有属性通过属性来定制对象从而使对索引的配置更加多变以适应于不同的应用
()存储(Storage)类
存储类指定构成Oracle Text索引的数据库表和索引的表空间参数和创建参数它仅有一个基本对象BASIC_STORAGE其属性包括I_Index_ClauseI_Table_ClauseK_Table_ClauseN_Table_ClauseP_Table_ClauseR_Table_Clause
()数据存储(Datastore)类
数据存储关于列中存储文本的位置和其他信息默认情况下文本直接存储到列中表中的每行都表示一个单独的完整文档其他数据存储位置包括存储在单独文件中或以其 URL 标识的 Web 页上七个基本对象包括Default_DatastoreDetail_DatastoreDirect_DatastoreFile_DatastoreMulti_Column_Datastore URL_DatastoreUser_Datastore
()文档段组(Section Group)类
文档段组是用于指定一组文档段的对象必须先定义文档段然后才能使用索引通过 WITHIN 运算符在文档段内进行查询文档段定义为文档段组的一部分包含七个基本对象AUTO_SECTION_GROUPBASIC_SECTION_GROUPHTML_SECTION_GROUPNEWS_SECTION_GROUPNULL_SECTION_GROUPXML_SECTION_GROUPPATH_SECTION_GROUP
()相关词表(Wordlist)类
相关词表标识用于索引的词干和模糊匹配查询选项的语言只有一个基本对象BASIC_WORDLIST其属性有Fuzzy_MatchFuzzy_NumresultsFuzzy_ScoreStemmerSubstring_IndexWildcard_MaxtermsPrefix_IndexPrefix_Max_LengthPrefix_Min_Length
()索引集(Index Set)
索引集是一个或多个Oracle 索引 (不是Oracle Text索引) 的集合用于创建 CTXCAT类型的Oracle Text索引只有一个基本对象BASIC_INDEX_SET
()词法分析器(Lexer)类
词法分析器类标识文本使用的语言还确定在文本中如何标识标记默认的词法分析器是英语或其他西欧语言用空格标准标点和非字母数字字符标识标记同时禁用大小写包含个基本对象BASIC_LEXERCHINESE_LEXERCHINESE_VGRAM_LEXERJAPANESE_LEXERJAPANESE_VGRAM_LEXERKOREAN_LEXERKOREAN__MORPH_ LEXERMULTI_LEXER
()过滤器(Filter)类
过滤器确定如何过滤文本以建立索引可以使用过滤器对文字处理器处理的文档格式化的文档纯文本和 HTML 文档建立索引包括个基本对象CHARSET_FILTERINSO_FILTER INSONULL_FILTERPROCEDURE_FILTERUSER_FILTER
()非索引字表(Stoplist)类
非索引字表类是用以指定一组不编入索引的单词 (称为非索引字)有两个基本对象BASIC_STOPLIST (一种语言中的所有非索引字) MULTI_STOPLIST (包含多种语言中的非索引字的多语言非索引字表)
查询
建立了索引就可以使用 SELECT 语句中的 CONTAINS 运算符发出文本查询使用 CONTAINS 可以进