科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用Oracle Text构建全文搜索应用程序(2)

使用Oracle Text构建全文搜索应用程序(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文讨论Oracle Text在虚拟的问题跟踪应用程序中的使用。在这个应用程序中,用户可以创建一些包含元数据和可选附加文件的问题。该应用程序利用Oracle Text实现元数据和可选附加文件内容的全文搜索功能。

作者:佚名 来源:Oracle中文技术网 2007年8月29日

关键字: ORACLE

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

Oracle Text 还可用于元数据的全文搜索。在示例应用程序中,有一个名为 issues 用于存储问题元数据的表。该表的定义如下:

CREATE TABLE issues ( 

id NUMBER, summary VARCHAR(120), description CLOB, author VARCHAR(80), ot_version VARCHAR(10) );

ot_version 列为索引列,可用于强制为特定文档重新建立索引。该表可使用测试数据填充:

INSERT INTO issues VALUES (1, 'Jane', 'Text does not make tea', 

'Oracle Text is unable to make morning tea', 1); INSERT INTO issues VALUES (2, 'John', 'It comes in the wrong color', 'I want to have Text in pink', 1);

用户索引

Oracle Text 可为来自不同数据源的数据建立索引。Oracle Text 可用于问题跟踪系统,提供对问题元数据的全文搜索。在默认情况下,您可为单个列中的值建立索引,但是,如果要合并多个表的数据,您需要创建一个自定义的 PL/SQL 过滤器过程。我将演示如何创建这样的过程,这个过程将起到存储抽象的作用。然后,该索引进程将迭代文本表中所有的行,为每一行调用过滤器过程。过滤器过程将返回所有与问题相关的有待建立索引的文本。

-- declare indexing procedure

CREATE PACKAGE ot_search AS

PROCEDURE issue_filter(rid IN ROWID, tlob IN OUT NOCOPY CLOB);

END ot_search;

/

-- define indexing procedure

CREATE PACKAGE BODY ot_search AS

PROCEDURE issue_filter(rid IN ROWID, tlob IN OUT NOCOPY CLOB) IS

BEGIN

FOR c1 IN (SELECT author, summary, description FROM issues WHERE rowid = rid)

LOOP

dbms_lob.writeappend(tlob, LENGTH(c1.summary)+1, c1.summary || ' ');

dbms_lob.writeappend(tlob, LENGTH(c1.author)+1, c1.author || ' ');

dbms_lob.writeappend(tlob, LENGTH(c1.description), c1.description);

END LOOP;

END issue_filter;

END ot_search;

/

-- define datastore preference for issues

BEGIN

ctx_ddl.create_preference('issue_store', 'user_datastore');

ctx_ddl.set_attribute('issue_store', 'procedure', 'ot_search.issue_filter');

ctx_ddl.set_attribute('issue_store', 'output_type', 'CLOB');

END;

/

-- index issues

CREATE INDEX issue_index ON issues(ot_version) INDEXTYPE IS ctxsys.context

PARAMETERS ('datastore issue_store');

搜索

CONTAINS 运算符用于搜索 CONTEXT 索引。虽然 CONTAINS 运算符语法的确支持 soundex 匹配等更高级的功能,但在这些示例中,我们只用了简单的布尔运算符来合并关键字。对于 Oracle Text 支持的语言,模糊匹配和词根还原都是默认启用的。要利用这些高级搜索功能,只需将 fuzzy() $ 查询运算符分别与 CONTAINS 运算符结合使用即可。通配符字符可用于前缀和后缀匹配的 CONTAINS 查询。下面是一些简单的查询示例:

SELECT id FROM issues WHERE CONTAINS(ot_version, 'color AND pink', 1) > 0;
  SELECT id FROM issues WHERE CONTAINS(ot_version, 'jane OR john', 1) > 0;

索引维护

由于基表数据是由索引复制的,因此这些数据需要定期与索引进行同步。在 CTX_DDL PL/SQL 程序包中可以发现索引维护过程。下面给出了一个示例,显示如何更新索引以反映基表更改:

EXECUTE ctx_ddl.sync_index('issue_index', '2M');

该同步过程为操作提供了索引名称和使用的内存量。也可以让数据库定期自动执行此项任务。您也可以选择使用操作系统或其他计划工具来启动同步。例如,在 Unix 系统上,可安排以下 shell 脚本与 Cron 作业,使系统按计划执行同步:

#!/bin/sh 

export ORACLE_SID=orcl export ORAENV_ASK=NO source /usr/local/bin/oraenv sqlplus ot1/ot1@XE > synch.log <  WHENEVER SQLERROR EXIT 5;

EXECUTE ctx_ddl.sync_index('issue_index', '2M'); EOF

CTX_DDL 程序包还包含其他有用的过程,例如索引优化,用于消除索引碎片和清除过期的数据。

如果出现错误,可通过 CTX_USER_INDEX_ERRORS 视图跟踪索引错误。

数据库根据索引列更改跟踪文档的变更,因此,如果您希望强制 Oracle Text 重新为某些文档建立索引,可以更新相应行的索引列,如下所示:

UPDATE files SET path=path WHERE id = 4;

这将在同步索引时更新 id 4 的文件的索引关键字。
 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章