在本文中,将探讨如何使用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'。