全文检索技术是智能信息管理的关键技术之一Oracle Text作为Oraclei的一个组件提供了强大的全文检索功能用Oraclei做后台数据库就可以充分利用其全文检索技术构建复杂的大型文档管理系统本文主要介绍了Oracle Text的体系结构及其使用
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 索引文档时所使用的主要逻辑步骤如下
()数据存储逻辑搜索表的所有行并读取列中的数据通常这只是列数据但有些数据存储使用列数据作为文档数据的指针例如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可使用若干个默认值但在大多数情况下要求用户通过指定首选项来配置索引
每个索引的许多选项组成功能组称为类&quo
每个类集中体现配置的某一方面可以认为这些类就是与文档数据库有关的一些问题例如数据存储过滤器词法分析器相关词表存储等
每个类具有许多预定义的行为称之为对象每个对象是类问题可能具有的答案并且大多数对象都包含有属性通过属性来定制对象从而使对索引的配置更加多变以适应于不同的应用
()存储(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 可以进行两种查询单词查询和ABOUT查询
词查询示例
词查询是对输入到 CONTAINS 运算符中单引号间的精确单词或短语的查询在以下示例中我们将查找文本列中包含 oracle 一词的所有文档每行的分值由使用标签 的 SCORE 运算符选定
SELECT SCORE() title from news WHERE CONTAINS(text oracle ) >
在查询表达式中可以使用 AND 和 OR 等文本运算符来获取不同结果还可以将结构性谓词添加到 WHERE 子句中可以使用 count(*)CTX_QUERYCOUNT_HITS 或 CTX_QUERYEXPLAIN 来计算查询的命中 (匹配) 数目
ABOUT查询示例
在所有语言中ABOUT查询增加了某查询所返回的相关文档的数目在英语中ABOUT 查询可以使用索引的主题词组件该组件在默认情况下创建这样运算符将根据查询的概念返回文档而不是仅依据所指定的精确单词或短语例如以下查询将查找文本列中关于主题 politics 的所有文档而不是仅包含 politics 一词的文档
SELECT SCORE() title from news WHERE CONTAINS(text about(politics) ) >
显示满足查询条件的文档
通常通过使用Oracle Text查询应用程序用户可查看查询所返回的文档用户从命中列表中选择一个文档然后应用程序以某种形式显示该文档通过Oracle Text可以用不同的方式再现文档例如可以通过突出显示查询词来显示文档突出显示的查询词可以是相关词查询中的词也可以是英文 ABOUT 查询中的主题词
以下是关于输出效果和用于每个输出效果的过程的信息
突出显示的文档纯文本格式版本(CTX_DOCMARKUP)
突出显示的文档HTML版本(CTX_DOCMARKUP)
突出显示纯文本格式版本的偏移量信息(CTX_DOCHIGHLIGHT)
突出显示HTML 版本的偏移量信息(CTX_DOCHIGHLIGHT)
纯文本格式版本无突出显示(CTX_DOCFILTER)
HTML版本文档无突出显示(CTX_DOCFILTER)
索引维护
索引建好后如果表中的数据发生变化比如增加或修改了记录怎么办?由于对表所发生的任何DML语句都不会自动修改索引因此必须定时同步(sync)和优化(optimize)索引以正确反映数据的变化
在索引建好后可以在该用户下查到Oracle自动产生了以下几个表(假设索引名为myindex)
DR$myindex$IDR$myindex$KDR$myindex$RDR$myindex$N
其中以I表最重要可以查询一下该表
select token_text token_count from DR$ myindex $I where rownum<=
查询结果在此省略可以看到该表中保存的其实就是Oracle 分析你的文档后生成的term记录
在这里包括term出现的位置次数hash值等当文档的内容改变后可以想见这个I表的内容也应该相应改变才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索其实核心就是查询这个表)那么如何维护该表的内容不能每次数据改变都重新建立索引这就要用到sync 和 optimize了
同步(sync)将新的term 保存到I表
优化(optimize)清除I表的垃圾主要是将已经被删除的term从I表删除
Oracle提供了一个所谓的ctx server来做这个同步和优化的工作只需要在后台运行这个进程它会监视数据的变化及时进行同步另外也可以用以下的job来完成(该job要建在和表同一个用户下)
create or replace procedure syncisbeginexecute immediatealter index myindex rebuild online || parameters ( sync ) ;execute immediatealter index myindex rebuild online || parameters ( optimize full maxtime unlimited ) ;end sync;/Set ServerOutput ondeclarev_job number;beginDbms_JobSubmit(job => v_jobwhat => sync;next_date => sysdate /* default */interval => sysdate + / /* = day / ( hrs * min) = mins */);Dbms_JobRun ( v_job );Dbms_OutputPut_Line ( Submitted as job # || to_char ( v_job ) );end;/
job的SYSDATE + (/)是指每隔分钟同步一次具体的时间间隔可以根据自己的应用的需要而定
总结
文本对于各种规模的公司机构组织来说都是包含众多丰富信息的最有效载体Oracle Text的推出标志着Oracle提供了一套崭新的技术可以便捷安全的用于管理企业的文本信息Oracle Text使应用程序开发者可以透明地将全文检索能力加入到基于SQL的应用程序中Oracle Text也是其他Oracle产品的核心组件比如OracleiAS PortalOracle eBusiness SuiteOracle Ultra Search和Oracle Internet File System等灵活运用Oracle Text提供的全文检索技术就可以使自己的应用具备强大的全文检索能力