使用Oracle Text索引文档

在本文中,将探讨如何使用OracleText创建文档索引,并使用VBScript和HTA创建用户界面以便于搜索文档。将通过以下步骤实现这一目标:

1. 使用SQL*Plus创建表、索引和存储过程 2. 使用VBScript导入文档 3. 创建用于搜索文档的用户界面(GUI)

首先,需要使用SQL*Plus创建Oracle对象。将创建一个名为my_doc的表,其中包含文件名、上传日期和内容等字段:

CREATE TABLE my_doc ( id NUMBER, file_name VARCHAR2(255), upload_date VARCHAR2(10), filesize VARCHAR2(20), mime VARCHAR2(50), content BFILE, CONSTRAINT doc_pk PRIMARY KEY(id) );

在这里,content字段被定义为BFILE类型,这意味着文档的内容并不存储在Oracle中。接下来,将定义一个目录,该目录将作为想要索引的文档的根文件夹。然后,将为用户ctxsys授予对该目录的读取权限:

CREATE OR REPLACE DIRECTORY documents AS 'C:\_work\datastore\'; GRANT READ ON DIRECTORY documents TO ctxsys;

接下来,将创建一个名为my_doc_idx的索引,类型为CTXSYS.CONTEXT:

CREATE INDEX my_doc_idx ON my_doc(content) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC (ON COMMIT)');

然后,将创建一个名为put_file的存储过程:

CREATE OR REPLACE PROCEDURE put_file( p_file_name IN my_doc.file_name%TYPE, p_upload_date IN my_doc.upload_date%TYPE, p_filesize IN my_doc.filesize%TYPE, p_mime IN my_doc.mime%TYPE ) AS index_name varchar2(20) := 'my_doc_idx'; BEGIN INSERT INTO my_doc (id, file_name, upload_date, filesize, mime, content) VALUES (my_doc_seq.NEXTVAL, p_file_name, p_upload_date, p_filesize, p_mime, BFILENAME('DOKUMENTE', p_file_name)); COMMIT; END;

现在已经完成了Oracle对象的创建。接下来,将使用SQL*Plus测试解决方案:

EXEC put_file('test.doc', '10.10.2005', '100', 'doc');

执行上述语句时,请确保文件test.doc存在于索引目录的根目录中。还应该检查表ctx_user_index_errors中的错误:

SELECT err_index_name, err_timestamp, err_text FROM ctx_user_index_errors ORDER BY err_timestamp;

如果在该表中没有错误,可以继续使用VBScript将更多文档插入表和索引中。要检查索引表的内容,可以使用index_stats.sql脚本,该脚本也在压缩源文件中。

接下来,将创建一个简单的VBScript文件来导入某个文件夹中的所有文档。首先,打开数据库连接并获取对根目录的访问权限。使用存储过程put_file将目录中的每个文件插入表my_doc中。最后,关闭数据库连接并清理所有使用过的对象。以下是VBScript文件的完整源代码:

Dim strFolder: strFolder = "C:\_work\datastore\" Dim strCon: strCon = "Driver={Microsoft ODBC for Oracle}; CONNECTSTRING=ORCL; uid=system;pwd=man;" Dim oCon: Set oCon = WScript.CreateObject("ADODB.Connection") oCon.Open strCon Dim oFs: Set oFs = WScript.CreateObject("Scripting.FileSystemObject") Dim oFolder: Set oFolder = oFs.GetFolder(strFolder) For Each oFile In oFolder.Files WScript.Echo oFile.Name Dim strCmd: strCmd = "put_file('" & oFile.Name & "','" & Date() & "','" & oFile.Size & "','" & oFs.GetExtensionName(oFile) & "')" oCon.Execute(strCmd) Next oCon.Close Set oFolder = Nothing Set oFs = Nothing Set oCon = Nothing

以上就是导入数据所需的全部代码。已经尽可能简化了代码。应该遍历目录结构以导入整个文档树。还应该检查错误 - 读取表ctx_user_index_errors。

正如在引言中承诺的那样,只需要记事本,即使是用户界面。因此,使用HTA作为搜索文档的用户界面。为此,创建了一个名为search.hta的文件。HTA使用Internet Explorer的GUI对象,但不需要Web服务器(如IIS)即可显示。首先,定义头部部分:

Indexed files

接下来,需要一个脚本部分来执行搜索并在HTA页面中显示结果。

在上述代码中,有一些值得关注的点:

strSql = "SELECT SCORE(1), file_name, filesize FROM my_doc WHERE CONTAINS(content," & Search.Value & ", 1) > 0 ORDER BY SCORE(1) DESC"

这是一个在文件内容上执行全文搜索的查询。例如:where条件CONTAINS(content, 'Perl', 1)仅选择包含字符串Perl的文档,并获取文档中的命中次数。变量Search.Value是稍后在HTA的主体部分定义的文本框的值。

DataArea.InnerHtml = strRes

当使用HTML表格格式化结果后,将表格分配给'DataArea.InnerHtml'。对象DataArea也在HTA的主体部分定义。在这里,看到了主体部分(删除了一些格式化代码,如表格和图片)以保持简单:

在主体部分,定义了一个名为Search的文本区域。Search.Value的内容作为Select语句的输入。接下来,定义了一个带有“Start Query”标题的按钮,事件处理程序调用在脚本部分定义的子程序StartQuery。最后,需要一个DataArea。将查询的格式化输出分配给'DataArea.InnerHtml'。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485