本文内容

假设用 SQL*Plus 已经创建了一个用户,并为该用户授权相应的角色和执行 CTX 包的权限。在此基础上,讨论 Oracle 全文检索中的 CONTEXT 索引。

CONTEXT 索引很适合索引大文档,如 MS Word、HTML,或纯文本。你可以以很多种不同的方式自定义一个 CONTEXT 索引。文档必须被加载在一个文本表中。

  • CONTEXT 索引和 DML
  • CONTEXT 索引的默认行为
  • 演示索引 HTML 文档
  • 演示用 FILTER BY 和 ORDER BY 处理的查询创建 CONTEXT 索引
  • CONTEXT 索引的“偏好”
  • 修改记录

 

CONTEXT 索引和 DML

CONTEXT 索引不是事务性的。

  • 当你删除记录时,索引的变化立刻反应出来。也就是说,从你删除记录那刻起,你的会话不能找到该记录。只要你提交,其他用户也将不能找到该记录。
  • 对于插入和更新,新的信息直到发生索引同步,文本搜索才能看到。

因此,当你执行插入或更新时,必须用 CTX_DDL.SYNC_INDEX 显示同步索引。

示例1:演示用 2M 内部同步索引。



begin
ctx_ddl.sync_index('myindex', '2M');
end;



示例2:演示用 2M 内存同步 part1 索引分区。



begin
ctx_ddl.sync_index('myindex', '2M', 'part1');
end;



参看 CTX_DDL.SYNC_INDEX 语法

 

CONTEXT 索引的默认行为

下面在 docs 表的 text 列上创建一个名为 myindex 默认 CONTEXT 索引:



CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;



该 SQL 是创建 CONTEXT 索引的最简单形式,没有任何配置。因此,有必要了解 Oracle 数据库在此情况的默认行为。

当使用 CREATE INDEX 没有显示指定参数时,系统对所有国家语言按如下默认动作:

  • 假设要索引的文本直接存储在 text 列。text 列可以是 CLOBBLOBBFILEVARCHAR2CHAR 类型。
  • 检查列的类型,并对 BLOBBFILE 二进制列使用过滤。大部分文档格式都支持过滤。如果你的列是纯文本,那么系统不使用过滤。
  • 假设要索引的文本的语言是你安装数据库时指定的。
  • 使用你安装数据库时指定语言的默认“非索引字列表(stoplist )”。非索引字列表标识索引期间系统忽略的词。这是为了精简全文索引,去掉那些经常出现但对搜索没用的字符串。在索引创建期间,将忽略这些词。如,在英语中,诸如 "a"、"and"、"is" 和 "the" 之类的词;中文中,那些咿咿呀呀的语气词等。
  • 为你的语言启用模糊和词干查询。当然如果该功能在你的语言可用的话。
  • 你总是可以通过填充因子(Preferences)和参数(parameter )改变默认的索引行为。在参数里使用填充因子。

 

演示索引 HTML 文档

若索引位于 URLs 的 HTML 文档集,你可以在 CREATE INDEX 语句中指定系统已定义的 NULL_FILTER

你也可以使用 HTML_SECTION_GROUP 指定节组,以及使用 URL_DATASTORE 数据存储在 my_url:



begin
ctx_ddl.create_preference('my_url','URL_DATASTORE');
ctx_ddl.set_attribute('my_url','HTTP_PROXY','www-proxy.us.oracle.com');
ctx_ddl.set_attribute('my_url','NO_PROXY','us.oracle.com');
ctx_ddl.set_attribute('my_url','Timeout','300');
end;



 



begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1');
end;



之后,你可以按如下索引你的文档:



CREATE INDEX myindex on docs(htmlfile) indextype is ctxsys.context
parameters(
'datastore my_url filter ctxsys.null_filter section group htmgroup'



);



说明:

本例先创建“填充因子”,并在创建 CONTEXT 索引时,在其参数中规定“填充因子”。

  • datastoremy_url
  • filterctxsys.null_filter
  • section grouphtmlgroup

 

自定义 CONTEXT 索引

通过在创建 CONTEXT 索引前创建“填充因子”,并在创建 CONTEXT 索引时参数中使用你创建填充因子,就可以自定义 CONTEXT 索引。

“填充因子”是 MS SQL Server 的叫法,我觉得蛮合适的,所以在 Oracle 中借用一下。所谓的“填充因子”相当于创建 CONTEXT 索引时/前对其的配置。

 

演示用 FILTER BY 和 ORDER BY 处理的查询创建 CONTEXT 索引

为了使查询处理更有效和混合查询响应时间更快,你可以在创建 CONTEXT 索引时使用 FILTER BYORDER BY  子句。如下所示:



CREATE INDEX myindex on docs(text) INDEXTYPE is CTXSYS.CONTEXT
FILTER BY category, publisher, pub_date
ORDER BY pub_date desc;



说明:

  • 通过在查询时指定过滤 categorypublisherpub_date 列,Oracle 文本将考虑把这些列的所有关系谓词放到文本索引的行资源,以获得更有效的查询处理。
  • 另外,通过指定 pub_date 降序排序,当查询已经匹配 ORDER BY 时,为了获得更好的响应时间,Oracle 文本将决定是否把 SORT 放到文本索引的行资源。

 

CONTEXT 索引的“偏好”


 

修改记录

  • 第一次 2012-04-14 [UPDATE][ADD]