|
技术说明
实现 Oracle Text 与 Discoverer 的融合 作者: Brian Carr,Oracle Giants 的创始人之一,Oracle ACE 的 Oracle 认证专家 发布日期:2005 年 9 月
如果您正在寻找一种方法来查询文档、电子表格以及其他文件格式中存储的大量数据,那么 Oracle Text 可以满足您的要求。 如果您正在寻找一种方法来查询数据库,那么不妨采用 Oracle Business Intelligence Discoverer 这个出色的解决方案。
在这篇技术说明中,我将介绍一种方法来帮助您利用 Oracle Text 的强大功能并在 Discoverer 中显示结果,从而为您的用户提供一个一站式服务,以满足他们的即席报告需要。 该方法适合于要针对这两个功能为用户提供一致界面的开发人员。
我将分步骤来说明过程并提供一个 PL/SQL 例程,以便将这两种强大的技术融合在一起。 完成这些步骤后,您的用户将能够:
- 在文档中搜索特定数据
- 返回与他们在 Discoverer Viewer、Plus 或 Desktop 中创建的条件匹配的文件列表
- 从 Discoverer 中下钻并打开文档
由于无法在 Discoverer 为 LOB 字段设置条件,因此我将介绍另一种文档搜索方法来搜索特定文本并将结果返回给用户。
第 1 步: 构建桥梁
Oracle Text 能够搜索各种文档类型并为内容创建索引,以便以后可以进行快速搜索。 Oracle Text 的用途之一(也是本示例的基础)是创建一个文档管理系统,用户可以向其中添加文档,然后搜索这些文档;您将定期构建 Oracle Text 索引。
开始之前,您应该已经创建了一个 Oracle Text 索引。 (有关详细信息,请参阅 Oracle 文档。) 当您创建 Oracle Text 索引时,将在同一模式中创建另一个表,该操作是在后台发生的。 该表包含在文档集中找到的所有文本。 您在此处所要做的就是将这些文本与它们所在的特定文档匹配,并将这个匹配对存储在一个名为 WORDS_BY_FILE 的新表中。 该表将作为 Discoverer 与 Text 之间的桥梁。
表 WORDS_BY_FILE 包含两个字段: FILE_NAME 和 WORD。 以这种方式构建表使您可以在 Discoverer 中使用条件来过滤数据集。 显而易见,该表可能会包含许多行。
CREATE TABLE LIBRARY.WORDS_BY_FILE (
FILE_NAME VARCHAR2(1024),
WORD VARCHAR2(64)
);
第 2 步: 填充桥梁表
您已经创建了桥梁表,下面需要填充它。 使用以下 PL/SQL 例程。
CREATE OR REPLACE PROCEDURE OracleText_WordsByFile IS
cursor WordList_cursor is
--create a recordset of all the words
--contained in this specific Oracle Context Index
select '{' || replace(token_text,'-','\-') || '}'
token_text
from LIBRARY.dr$idxLibraryLitBinary$i
group by token_text;
varTokenText LIBRARY.dr$idxLibraryLitBinary$i.TOKEN_TEXT%TYPE;
BEGIN
open WordList_cursor;
loop
varTokenText := NULL;
fetch WordList_cursor into varTokenText;
exit when WordList_cursor%notfound;
insert into LIBRARY.WORDS_BY_FILE
select TRIM(A.FILE_NAME),
SUBSTR(TRIM(varTokenText),2,LENGTH(TRIM(varTokenText))-2)
from library.literature a
where contains(text,varTokenText,1) > 0;
commit;
end loop;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
close WordList_cursor;
END;
/
运行该过程的执行时间将取决于为其创建索引的文档的数量和大小。
set timing on;
set serveroutput on;
execute OracleText_WordsByFile;
执行该过程后,请转到 Discoverer 并创建业务区域。
第 3 步: 创建 Discoverer 业务区域
从 Discoverer Administrator 中,选择“create a new business area”。 将 WORDS_BY_FILE 表包含到新的业务区域中。 您将在此处创建一个标准业务区域,但下面的操作是个例外: 在 Discoverer Administrator 中,将 FILE_NAME 字段的“Content Type”设置为 File(如下所示)。 Content Type 字段描述了钻取时使用的多媒体数据的类型。 因此,通过将该参数设置为 File,Windows 对该文件类型的处理方法将与您从 Windows Explorer 中打开它一样。
图 1 将 FILE_NAME 字段的“Content Type”设置为 File
第 4 步: 从 Discoverer 中查询和钻取
您已经创建了桥梁表和业务区域,下面您将把两者融合在一起并查看结果。
在 Discoverer Desktop 中,创建一个新的工作表。 然后,通过创建一个条件来过滤数据。 例如,假设您要查看所有包含文本“refills”和“product”的文档。 为此,您将创建一个条件列 'Word' IN ('REFILLS','PRODUCT')。 要确保只获得包含这两个文本的文档,您需要创建第二个条件 COUNT(1) = 2。 (如果试图查找包含三个文本的文档,请将该条件更改为 COUNT(1) = 3,依此类推。) 实际上,您在此处执行的操作是为了创建一个 AND 查询。
图 2 包含两个特定文本(AND 语句)的文件
图 3 Desktop 中显示的查询结果;双击 Adobe PDF 图标可以查看完整的 PDF
执行 OR 查询更简单: 只需删除(取消选中)COUNT(1) = 2 条件。 现在,您将看到所有包含文本“refills”或“product”的文档。
图 4 包含两个文本之一(OR 语句)的文件
图 5 View 中显示的查询结果;左键单击全局图标可以查看实际文件(例如,在 Word 文档中查看)
恭喜您!您已经创建了一个让用户可以通过 Discoverer 对文本文档执行即席查询的应用程序!
|