关于 Oracle 11g Release 1 (11.1) Oracle Text 应用程序开发
http://docs.oracle.com/cd/B28359_01/text.111/b28303/overview.htm#i1007403
本文内容
- 介绍
- 文档集合应用程序
- 目录信息应用程序
- 文档分类应用程序
- XML 搜索应用程序
- 总结
- 参考资料
介绍
Oracle 全文检索可以建立文本查询应用程序和文档分类应用程序。它提供索引、文字和主题搜索,以及文档浏览功能。
设计一个 Oracle 全文检索应用程序,先要确定你想执行什么样的查询,以便选择最合适的索引。
因此,利用 Oracle 全文检索,我们建立以下三种应用程序:
- 文档集合应用程序
- 目录信息应用程序
- 文档分类应用程序
文档收集应用程序
“文本查询应用程序”可以使用户搜索文档集合,例如,一个 Web 站点,数字图书馆,或是文档仓库。该文档集合通常是静态的,当初始建立索引后,内容没有显著的变化。文档可以任意大小、任意格式的 HTML、PDF 和 MS Word 文档。这些文档存储在表中。通过索引来搜索。
通常,查询由字或词组组成。用户可以通过例如 OR 和 AND,指定文字和词组的逻辑关系。其他查询运算符,如词干(stemming)、接近搜索(proximity searching)和通配符(wildcarding),用于改进搜索结果。
这种类型应用程序的一个重要因素是,搜索到相关的文档,也要尽可能搜索相关性小的文档。最相关的文档必须被排在结果列表中。
CONTEXT 索引为这种类型的应用程序提供最好的支持。若搜索该索引,在 SELECT 语句的 WHERE 子句使用 CONTAINS 运算符。
在文档集合上,一个典型的文本查询应用程序让用户输入一个查询。应用程序进入 CONTAINS 查询,并返回满足查询的一个列表,称为“命中列表(hitlist)”。结果通常按相关性排列。应用程序可以使用户在命中列表中浏览一个或多个文档。
例如,一个应用程序在 WWW 为 URLs(HTML 文件)建立索引,通过索引集,提供查询功能。应用程序查询返回的命中列表是由用户可访问的 URLs 组成。
下图说明对于一个在线电子商店,文本搜索应用程序的流程:
- 用户输入一个查询。
- 应用程序运行一个 CONTAINS 查询。
- 应用程序实现一个 命中列表。
- 用户从命中列表选择文档。
- 应用程序为用户显示要浏览的文档。
图2 文本搜索应用程序流程
目录信息应用程序
目录(类别)信息是由清单信息组成,例如一个在线书店或拍卖站点的清单信息。存储的信息由文本信息(如书的标题)和相关结构化信息(如价格)组成。通常,信息是定期更新的。
查询通常是文本和结构化信息的组合。结果几乎总是按结构化信息来排序,如日期或价格。良好的响应时间始终是一个这类查询应用程序的重要因素。
CTXCAT 索引能为目录应用程序提供最好的服务。在 SELECT 语句中的 WHERE 子句中,用 CATSEARCH 运算符查询该索引。
图3 说明目录表(catalog table)的关系,CTXCAT 索引,和使用 CATSEARCH 运算进行查询该索引。
图3 目录查询应用程序
目录应用程序使用户能够搜索目录中的特定条目。例如,网上在线商店使用户搜索和购买清单中的条目。通常情况下,用户查询由一个文本组成,通过文字性描述,加上其他订购标准进行搜索,如价格或日期。
下图说明一个在线电子商店的目录查询应用程序的流程图。
- 用户输入查询,该查询由一个文本组成,例如,"cd player" 和一个结构化信息,例如,"order by price"。
- 应用程序执行 CATSEARCH 查询。
- 应用程序显示按相应排序的结果。
- 用户浏览结果。
- 之后,用户或者输入其他查询,或是执行一个动作,如购买该条目。
图4 一个目录查询应用程序的流程图
文档分类应用程序
在一个文档分类应用程序中,一个到来的流或一个文档与预定义的一套规则比较。当一个文档符合一个或多个规则时,应用程序就会执行某个动作。
例如,假设有一个新文章的到来流。你可以定义一个规则表示它是金融类。基本上,规则是一个或多个选择有关金融文章的查询。该规则可以有“股票或债券或盈利”的形式。当一个文档到达“华尔街盈利预测”,并满足该目录的规则时,应用程序会采取一个动作,例如,标记该文档为金融,或发送邮件给一个或多个用户。
若要创建一个文档分类应用程序,先创建一个规则表,之后创建 CTXRULE 索引。若要分类一个到来的文档流,在 SELECT 语句的 WHERE 子句中,使用 MATCHES 运算符。分类应用程序的一般流程如下图所示。
图 5 文档分类应用程序的一般流程
XML 搜索应用程序
一个 XML 文档搜索应用程序通过 XML 文档执行搜索。一个普通的文件通常搜索是,搜索文档集合,并返回满足一个文本谓词的文档;一个 XML 搜索常常使用 XML 文档的结构以限制搜索的范围。通常,只返回满足搜索的文档的一部分。例如,用户可能只采购在“注释字段”中包含“电子”的订单,而不是查找所有包含单词“电子”的。
Oracle 全文检索使用如下方法完成 XML 搜索:
- 使用 Oracle 文本
- 使用 Oracle XML DB 框架
- Oracle 文本 和 Oracle XML DB 相结合
使用 Oracle 文本
在 CONTAINS 运算符非常适合结构化搜索,让你用 WITHIN、HASPATH 和 INPATH 运算符来执行限制的搜索。Oracle 文本的 CONTEXT 索引有如下好处:
- 搜索是基于 token,空白标准化
- 命中列表通过相关性来排列
- 大小写敏感搜索
- 章节搜索
- 语言特点,例如词干和模糊搜索
- 对于大文本,优化查询性能
使用 Oracle XML DB 框架
利用 Oracle XML DB,你可以在 XMLType 列加载你的 XML 文档。利用 Oracle XML DB 进行 XML 搜索通常由一个 existsNode()、extract(),或 extractValue() 查询的 XPATH 表达式组成。该类型的搜索有如下特点:
- 它是一个非文本的等值,并且日期和数字范围的搜索。
- 它是基于字符的字符串搜索,所有字符都被同样对待。
- 它能在一个 CTXXPATH 索引上使用 ora:contains() 函数,以加速 existsNode() 查询。
该类型搜索有如下缺点:
- 它没有特定的语言处理。
- 它使用精确匹配,因此,没有相关性的概念。
- 它的某些搜索很慢,例如通配符:
WHERE col1 like '%dog%'
Oracle 文本和 Oracle XML DB 相结合
你可以把 Oracle 文本和 Oracle XML DB 结合起来,在应用程序中,进行全文本搜索,并利用 XML 结构,查询“所有包含单词 'Pentium' 的节点”。有两种方法来完成:
-
使用 Text-on-XML 方法
-
使用 XML-on-Text 方法
- 使用 Text-on-XML 方法
对于 Oracle 文本,你可以在一个包含 XML 数据的列上创建一个 CONTEXT 索引。这个列可以是 XMLType 类型,e的,但它也可以是任何你能为 XML 数据创建正确索引引用的支持类型。
Text-on-XML 方法使用标准的 CONTAINS 查询,并添加一个结构化的约束,以便把一个搜索的作用域限制在一个特定的小节、域、标签或属性。这是在文本运算符内部指定结构,例如,WITHIN、HASPATH 和 INPATH。
例如,建立 CONTEXT 索引,用 XML 文档创建节。考虑下面定义的一个采购订单的 XML 文档。
<?xml version="1.0"?>
<PURCHASEORDER pono="1">
<PNAME>Po_1</PNAME>
<CUSTNAME>John</CUSTNAME>
<SHIPADDR>
<STREET>1033 Main Street</STREET>
<CITY>Sunnyvalue</CITY>
<STATE>CA</STATE>
</SHIPADDR>
<ITEMS>
<ITEM>
<ITEM_NAME> Dell Computer </ITEM_NAME>
<DESC> Pentium 2.0 Ghz 500MB RAM </DESC>
</ITEM>
<ITEM>
<ITEM_NAME> Norelco R100 </ITEM_NAME>
<DESC>Electric Razor </DESC>
</ITEM>
</ITEMS>
</PURCHASEORDER>
若在 <item> 节查询所有包含 "Pentium" 采购订单,使用 WITHIN 运算符:
SELECT id from po_tab where CONTAINS( doc, 'Pentium WITHIN desc') > 0;
使用 INPATH 运算符,指定带 XPATH 表达式的、更复杂的条件:
SELECT id from po_tab where CONTAINS(doc, 'Pentium INPATH (/purchaseOrder/items/item/desc') > 0;
- 使用 XML-on-Text 方法
XML-on-Text 方法可以向 XML 搜索添加文本运算符。这通常在带 existsNode()、extract() 和 extractValue() 查询的 XPATH 表达式中包含 ora:contains() 函数。这是在结构内部包含文本谓词。例如:
SELECT
Extract(doc, '/purchaseOrder//desc{ora:contains(.,"pentium")>0]',
'xmlns:ora=http://xmlns.oracle.com/xdb')
"Item Comment" FROM po_tab_xmltype
/
另外,使用 CTXXPATH 文本域索引,可以改进 existsNode()、extract(),和 extractValue() 的查询性能。
总结
简单来说,比如一个图书馆,我若是找某一本书,可以一本一本去找,这就相当于本文中提到的“文档收集应用程序”,它使用 CONTEXT 索引。该类型是最基本的索引。
可每本书都有它相应的类型,比如,地理、历史、政治等,那我就可以在这个类型中去找我想要的那本书,这就相当于“目录信息应用程序”,它 CTXCAT 索引。在购物网站上,这个很常见。
更进一步,我除了可以规定书的类型外,也可以书指定规则,或者说标签,比如,作者,国家,就好像写博文时,可以将文中出现的关键词作为文章的标签,这就是“文档分类应用程序”,它使用 CTXRULE 索引。
这些索引都是建立在 Oracle 关于字符的字段上,既然是字符,那就有非结构化的和结构化的区别。非结构化的,如纯文本;结构化的如 XML 文件,HTML 文档也是。如果是 XML 文档,除了可以把它当作一般文本搜索,也可以利用 XPAHT 搜索。因此,Oracle 的 VARCHAR2、CLOB、XMLTYPE 等,都可以建索引。
参考资料
- Oracle 11g Release 1 (11.1) Oracle Text 使用演示 http://www.cnblogs.com/liuning8023/archive/2012/04/05/2432605.html