本文内容
假设用 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;
CONTEXT 索引的默认行为
下面在 docs 表的 text 列上创建一个名为 myindex 默认 CONTEXT 索引:
CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
该 SQL 是创建 CONTEXT 索引的最简单形式,没有任何配置。因此,有必要了解 Oracle 数据库在此情况的默认行为。
当使用 CREATE INDEX 没有显示指定参数时,系统对所有国家语言按如下默认动作:
- 假设要索引的文本直接存储在 text 列。text 列可以是 CLOB、BLOB、BFILE、VARCHAR2 和 CHAR 类型。
- 检查列的类型,并对 BLOB 和 BFILE 二进制列使用过滤。大部分文档格式都支持过滤。如果你的列是纯文本,那么系统不使用过滤。
- 假设要索引的文本的语言是你安装数据库时指定的。
- 使用你安装数据库时指定语言的默认“非索引字列表(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 索引时,在其参数中规定“填充因子”。
- datastore 为 my_url
- filter 为 ctxsys.null_filter
- section group 为 htmlgroup
自定义 CONTEXT 索引
通过在创建 CONTEXT 索引前创建“填充因子”,并在创建 CONTEXT 索引时参数中使用你创建填充因子,就可以自定义 CONTEXT 索引。
“填充因子”是 MS SQL Server 的叫法,我觉得蛮合适的,所以在 Oracle 中借用一下。所谓的“填充因子”相当于创建 CONTEXT 索引时/前对其的配置。
演示用 FILTER BY 和 ORDER BY 处理的查询创建 CONTEXT 索引
为了使查询处理更有效和混合查询响应时间更快,你可以在创建 CONTEXT 索引时使用 FILTER BY 和 ORDER BY 子句。如下所示:
CREATE INDEX myindex on docs(text) INDEXTYPE is CTXSYS.CONTEXT
FILTER BY category, publisher, pub_date
ORDER BY pub_date desc;
说明:
- 通过在查询时指定过滤 category、publisher、pub_date 列,Oracle 文本将考虑把这些列的所有关系谓词放到文本索引的行资源,以获得更有效的查询处理。
- 另外,通过指定 pub_date 降序排序,当查询已经匹配 ORDER BY 时,为了获得更好的响应时间,Oracle 文本将决定是否把 SORT 放到文本索引的行资源。
CONTEXT 索引的“偏好”
修改记录
- 第一次 2012-04-14 [UPDATE][ADD]