关于 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 运算符。

ccapp014图1 文本查询应用程序

在文档集合上,一个典型的文本查询应用程序让用户输入一个查询。应用程序进入 CONTAINS 查询,并返回满足查询的一个列表,称为“命中列表(hitlist)”。结果通常按相关性排列。应用程序可以使用户在命中列表中浏览一个或多个文档。

例如,一个应用程序在 WWW 为 URLs(HTML 文件)建立索引,通过索引集,提供查询功能。应用程序查询返回的命中列表是由用户可访问的 URLs 组成。

下图说明对于一个在线电子商店,文本搜索应用程序的流程:

  1. 用户输入一个查询。
  2. 应用程序运行一个 CONTAINS 查询。
  3. 应用程序实现一个 命中列表。
  4. 用户从命中列表选择文档。
  5. 应用程序为用户显示要浏览的文档。

ccapp015

图2 文本搜索应用程序流程

 

目录信息应用程序

目录(类别)信息是由清单信息组成,例如一个在线书店或拍卖站点的清单信息。存储的信息由文本信息(如书的标题)和相关结构化信息(如价格)组成。通常,信息是定期更新的。

查询通常是文本和结构化信息的组合。结果几乎总是按结构化信息来排序,如日期或价格。良好的响应时间始终是一个这类查询应用程序的重要因素。

CTXCAT 索引能为目录应用程序提供最好的服务。在 SELECT 语句中的 WHERE 子句中,用 CATSEARCH 运算符查询该索引。

图3 说明目录表(catalog table)的关系,CTXCAT 索引,和使用 CATSEARCH 运算进行查询该索引。

目录查询应用程序

图3 目录查询应用程序

目录应用程序使用户能够搜索目录中的特定条目。例如,网上在线商店使用户搜索和购买清单中的条目。通常情况下,用户查询由一个文本组成,通过文字性描述,加上其他订购标准进行搜索,如价格或日期。

下图说明一个在线电子商店的目录查询应用程序的流程图。

  1. 用户输入查询,该查询由一个文本组成,例如,"cd player" 和一个结构化信息,例如,"order by price"。
  2. 应用程序执行 CATSEARCH 查询。
  3. 应用程序显示按相应排序的结果。
  4. 用户浏览结果。
  5. 之后,用户或者输入其他查询,或是执行一个动作,如购买该条目。

一个目录查询应用的流程图

图4 一个目录查询应用程序的流程图

 

文档分类应用程序

在一个文档分类应用程序中,一个到来的流或一个文档与预定义的一套规则比较。当一个文档符合一个或多个规则时,应用程序就会执行某个动作。

例如,假设有一个新文章的到来流。你可以定义一个规则表示它是金融类。基本上,规则是一个或多个选择有关金融文章的查询。该规则可以有“股票或债券或盈利”的形式。当一个文档到达“华尔街盈利预测”,并满足该目录的规则时,应用程序会采取一个动作,例如,标记该文档为金融,或发送邮件给一个或多个用户。

若要创建一个文档分类应用程序,先创建一个规则表,之后创建 CTXRULE 索引。若要分类一个到来的文档流,在 SELECT 语句的 WHERE 子句中,使用 MATCHES 运算符。分类应用程序的一般流程如下图所示。

文档分类应用程序的一般流程

图 5 文档分类应用程序的一般流程

 

XML 搜索应用程序

一个 XML 文档搜索应用程序通过 XML 文档执行搜索。一个普通的文件通常搜索是,搜索文档集合,并返回满足一个文本谓词的文档;一个 XML 搜索常常使用 XML 文档的结构以限制搜索的范围。通常,只返回满足搜索的文档的一部分。例如,用户可能只采购在“注释字段”中包含“电子”的订单,而不是查找所有包含单词“电子”的。

Oracle 全文检索使用如下方法完成 XML 搜索:

  • 使用 Oracle 文本
  • 使用 Oracle XML DB 框架
  • Oracle 文本 和 Oracle XML DB 相结合
使用 Oracle 文本

CONTAINS 运算符非常适合结构化搜索,让你用 WITHINHASPATHINPATH 运算符来执行限制的搜索。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' 的节点”。有两种方法来完成:

        1. 使用 Text-on-XML 方法

        2. 使用 XML-on-Text 方法

  • 使用 Text-on-XML 方法

对于 Oracle 文本,你可以在一个包含 XML 数据的列上创建一个 CONTEXT 索引。这个列可以是 XMLType 类型,e的,但它也可以是任何你能为 XML 数据创建正确索引引用的支持类型。

Text-on-XML 方法使用标准的 CONTAINS 查询,并添加一个结构化的约束,以便把一个搜索的作用域限制在一个特定的小节、域、标签或属性。这是在文本运算符内部指定结构,例如,WITHINHASPATHINPATH

例如,建立 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 的 VARCHAR2CLOBXMLTYPE 等,都可以建索引。

 

参考资料

posted @ 2012-04-07 02:02  船长&CAP  阅读(650)  评论(0编辑  收藏  举报
免费流量统计软件