Oracle Text为查询应用程序和文档分类应用程序中的文本提供索引,单词和主题搜索以及查看功能。
要设计Oracle Text应用程序,首先确定期望运行的查询类型。 知道类型后,就可以为任务选择最合适的索引。
Oracle Text用于以下类别的应用程序:
Document Collection Applications
Catalog Information Applications
Document Classification Applications
XML Search Applications
1.文档集合应用程序
文本查询应用程序使用户可以搜索文档集合,例如网站,数字图书馆或文档仓库。
1.1关于
文档集合应用集合
该集合通常是静态的,并且在初始索引运行之后,内容没有明显变化。 文档可以是任何大小和格式,例如HTML,PDF或Microsoft Word。 这些文档存储在文档表中。 通过首先为文档集合建立索引来启用搜索。
查询通常由单词或短语组成。 应用程序用户使用OR和AND等运算符指定单词和短语的逻辑组合。 用户可以应用其他查询操作来改善搜索结果,例如词干,邻近搜索和通配符。
对于这种类型的应用程序,应该检索与查询最相关的文档。 文档必须在结果列表中排在高位。
查询最好与文档表上的CONTEXT索引一起使用。 为了查询该索引,应用程序在SELECT语句的WHERE子句中使用SQL CONTAINS运算符。
1.2文本查询应用程序流程图
文档集合上的典型文本查询应用程序使用户可以输入查询。 该应用程序输入CONTAINS查询,并返回满足查询条件的文档列表(称为命中列表)。 结果通常按相关性排名。 该应用程序使用户可以查看命中列表中的一个或多个文档。
例如,一个应用程序可能会索引Web上的URL(HTML文件)并在整个索引URL中提供查询功能。 查询应用程序返回的命中列表由用户可以访问的URL组成。
下图展示了用户与简单文本查询应用程序进行交互的流程图:
1)用户输入查询
2)该应用程序运行CONTAINS查询
3)应用程序将显示一个命中列表
4)用户从命中列表中选择文档
5)该应用程序将文档呈现给用户以供查看
2.目录信息应用程序
目录信息由库存类型信息组成,例如在线书店或拍卖网站。
2.1关于目录信息应用程序
存储的目录信息由文本信息(例如书名)和相关结构化信息(例如价格)组成。 通常会定期更新信息,以使在线目录与库存保持最新。
查询通常是文本组件和结构化组件的组合。 结果几乎总是按结构化组成部分排序,例如日期或价格。 良好的响应时间始终是此类查询应用程序的重要因素。
CTXCAT索引可以最好地服务Catalog应用程序。 在SELECT语句的WHERE子句中使用CATSEARCH运算符查询此索引。
2.2目录查询应用程序流程图
目录应用程序使用户可以搜索目录中的特定项目。 例如,在线商店应用程序使用户可以搜索和购买库存中的物品。 通常,用户查询由一个文本组件组成,该组件在文本描述以及一些其他订购条件(例如价格或日期)中进行搜索。
下图说明了在线电子商店的目录查询应用程序的流程图:
1)用户输入一个查询,该查询由文本组件(例如CD播放器)和结构化组件(例如按价格订购)组成。
2)该应用程序执行CATSEARCH查询。
3)该应用程序显示相应的排序结果。
4)用户浏览结果。
5)用户输入另一个查询或执行操作,例如购买商品。
3.文档分类应用程序
在文档分类应用程序中,将输入流或一组文档与一组预定义规则进行比较。 如果文档符合一个或多个规则,则应用程序将执行一项操作。
例如,假设有新闻报道传入。 定义一个规则来表示“财务”类别。 该规则本质上是一个或多个查询,用于选择有关财务主题的文档。 该规则可能具有“股票或债券或收益”的形式。
当文档到达华尔街收入预测并满足该类别的规则时,应用程序将采取措施,例如将文档标记为财务或向一个或多个用户发送电子邮件。
要创建文档分类应用程序,请创建一个规则表,然后创建一个CTXRULE索引。 要对输入的文本流进行分类,请在SELECT语句的WHERE子句中使用MATCHES运算符。
4.XML搜索应用程序
XML搜索应用程序对XML文档执行搜索。 常规文档搜索通常会搜索一组文档,以返回满足文本谓词的文档。 XML搜索通常使用XML文档的结构来限制搜索。 通常,仅返回满足搜索条件的文档部分。 例如,用户可能只需要注释字段包含电力的采购订单,而不是查找包含单词"电力"的所有采购订单。
4.1具有XML搜索应用程序的CONTAINS运算符
CONTAINS运算符非常适合结构化搜索,可以使用WITHIN,HASPATH和INPATH运算符执行限制性搜索。 如果使用CONTEXT索引,那么还可以受益于Oracle Text搜索的以下特征:
基于令牌的空格标准化搜索
命中列表按相关性排名
区分大小写的搜索
章节搜索
语言功能,例如词干和模糊搜索
针对大型文档集的性能优化查询
注意:如果手动卸载Oracle Text,则删除DBMS_XDBT软件包。 如果手动安装Oracle Text,则创建DBMS_XDBT软件包。从Oracle Database 12c开始,当安装新的Oracle数据库软件或进行升级时,将自动安装Oracle XML数据库(XML DB)。
4.2将Oracle文本功能与Oracle XML DB(XML Search Index)相结合
当请想要对应用程序进行全文检索时,结合使用Oracle Text和Oracle XML DB的功能来创建XML搜索索引。 在这种情况下,通过输入诸如"查找包含单词Pentium的所有节点"之类的查询来利用XML结构。 Oracle Database 12c通过添加对XQuery全文扩展的支持,扩展了Oracle对W3C XQuery规范的支持。 通过此支持,可以对存储在数据库中的XML内容执行支持XML的全文搜索。
4.2.1使用xml_enable方法获取XML Search Index
XML Search Index是启用XML的Oracle文本索引(CTXSYS.CONTEXT)。 该索引类型在一个统一索引中支持信息检索搜索和结构化搜索。XML Search Index还在Oracle文本表中内部存储了二进制持久文档对象模型(PDOM),因此可以在二进制PDOM上对XML操作进行功能评估。 XMLTYPE数据存储支持此XML搜索索引。 在存在这样的XML搜索索引的情况下,XMLEXISTS被无缝地重写为CONTAINS查询。
创建XML Search Index时,将在Oracle Text内部表中实现XML文档的Binary PDOM。 来自Oracle Text索引的后期评估被重定向为与存储在此内部表中的PDOM背道而驰。
创建XML Search Index:
exec CTX_DDL.CREATE_SECTION_GROUP('secgroup','PATH_SECTION_GROUP');
exec CTX_DDL.SET_SEC_GRP_ATTR('secgroup','xml_enable','t');
CREATE INDEX po_ctx_idx on T(X) indextype is ctxsys.context parameters ('section group SECGROUP');
4.2.2使用Text-on-XML方法
使用Oracle Text,可以在包含XML数据的列上创建CONTEXT索引。 列类型可以是XMLType或任何受支持的类型,只要对XML数据使用正确的索引首选项。
使用XML上的文本方法,使用标准的CONTAINS查询并添加结构化约束,以将搜索范围限制为特定部分,字段,标记或属性。 即,指定文本运算符内部的结构,例如WITHIN,HASPATH和INPATH。
例如,设置的CONTEXT索引以使用XML文档创建章节。 考虑以下定义purchase order的XML文档:
Po_1
John
1033 Main Street
Sunnyvalue
CA
Dell Computer
Pentium 2.0 Ghz 500MB RAM
Norelco R100
Electric Razor
--要在ITEM描述部分中查询所有包含Pentium的purchase order,请使用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;
4.2.3索引JSON数据
JavaScript Object Notation(JSON)是一种独立于语言的数据格式,用于序列化结构化数据并通过网络(通常在服务器和Web应用程序之间)交换该数据。 JSON提供了一种基于文本的方式来表示JavaScript对象文字,数组和标量数据。
create table t1 (txn_date date, po CLOB, constraint c1 check (po is json));
create search index idx on t1(po) for JSON parameters('DATAGUIDE ON sync (on commit)');