Oracl对本地文件全文检索


 

 

Oracle Text支持对本地文件的检索

它的实现是依靠参数datastore和filter的组合。在数据库的文本列中只保存指向硬盘文件的指针。建立索引的时候,oracle读取硬盘上的文件并且将索引存储在oracle数据库中。

Oracle支持对很多格式的文件的文本检索,包括文本文件Txt,  Html文件, Word文档,  Excel表格,  PowerPoint 的文本检索,也支持PDF(pdf版本1.4目前还不支持)。

      而且配合Lexer参数很好的支持了中文字符集的检索。

   

具体实现方法:

        首先,建立存储选项参数。制定DATASTORE参数为FILE_DATASTROE,提示Oracle从文件路径中索引文本。

             然后制定path参数,你可以指定多个文件存储的文件路径 ,windows环境用”;”号间隔(Path1;Path2;Path3;;),Unix环境用:号间隔(Path1:Path2:Path3::)

BEGIN
CTX_DDL.CREATE_PREFERENCE( 'my_datastore_prefs', 'FILE_DATASTORE' );
CTX_DDL.SET_ATTRIBUTE( 'my_datastore_prefs', 'path', 'C:\TEMP' );
END;
/

 

        下一步,建立保存这些文件名称的表。Id列是主键,title列是对文本的简单说明,thefile列保存着磁盘中Path目录下文件的名称。文件必须能够在Path路径下找到,否则Oracle会报文件无法访问的错误信息。
        然后向表中插入数据,注意:thefile列保存的必须是服务器上的指定的Path路径下面的文件。

 

 
CREATE TABLE mydocs( id NUMBER PRIMARY KEY, title VARCHAR2(255), thefile 
VARCHAR2(255) );
 
INSERT INTO mydocs( id, title, thefile ) VALUES( 1, 'Document1', 'WordDoc1.doc' 
);
INSERT INTO mydocs( id, title, thefile ) VALUES( 2, 'Document2', 'WordDoc2.doc' 
);
INSERT INTO mydocs( id, title, thefile ) VALUES( 3, 'Document3', 'WordDoc3.doc' 
);
COMMIT;
 

 

建立全文索引,使用参数Datastore和Filter,Lexer 。 Filter可以帮助Oracle识别不同格式文件,可以是文本文件,Word文档,Pdf文档等。Lexer用来保证可以很好的从文件中索引中文信息。

 

 
CREATE INDEX mydocs_text_index ON mydocs(thefile) INDEXTYPE IS ctxsys.context
    PARAMETERS('datastore my_datastore_prefs Filter ctxsys.inso_filter Lexer my_lexer');
 
--
-- 测试是否索引文件成功
-- 
SELECT id,title
  FROM mydocs
 WHERE contains( thefile, '你好' ) > 0;

 

 

 

指定路径带来的相关问题:

如CTX_DDL.SET_ATTRIBUTE( 'my_datastore_prefs', 'path', 'c:\TEMP;c:\docs' );
如果在2个目录中均有同名的文件1.doc,如果在thefile列中保存的仅仅是文件名称 1.doc,则Oracle顺序查找路径下的文件,这样就会索引2次在C:\TEMP下的文件1.doc. 我们可以通过加上文件的路径信息。
 
在维护文档修改的时候同步索引的问题:
如果你修改了路径下面的某个文件的内容,加入了文本或者删除了文本,Oracle在同步的时候不会察觉到文档的内容的修改。有一个方法可以保证同步:
  修改了内容之后,更新一下表thefile的信息,但仍保证文本路径不变。
  update mydocs set thefile=’c:\source.doc’ where thefile=’c:\source.dco’
 再次执行同步索引的时候,Oracle才会保持文档内容同步。
 
关于建立以及同步索引的时候发生的错误信息可以从ctx_user_index_errors用户视图中查看。

 

 

 

Oracle Text 支持检索对网页的文本检索

通过在表里面存储网络上各种格式的文本文件,HTML文件的路径Url。Oracle在建立索引的时候,可以顺着Url读取文件的流信息,并且将索引存储在磁盘上。这样通过本地查找索引可以获得有用的网页的Url。

通过自定义Datastore选项,指定URL_DATASTORE 类型。它支持Http访问,和Ftp访问,本地文件系统的访问

    存储在文本列中的Url格式如下:
 [URL:]<access_scheme>://<host_name>[:<port_number>]/[<url_path>]
 

access_scheme 字符串可以是ftp, http, 或者 file. 例如:

http://mymachine.us.oracle.com/home.html

Note:

login:password@ 格式的语法只有在Ftp访问形式下才有效


URL_DATASTORE 参数

URL_DATASTORE的一些参数,其中timeout,proxy是经常用到的:

Attribute

Attribute Values

timeout

Specify the timeout in seconds. The valid range is 15 to 3600 seconds. The default is 30.这个参数根据网络性能调整。

maxthreads

Specify the maximum number of threads that can be running simultaneously. Use a number between 1and 1024. The default is 8.

urlsize

Specify the maximum length of URL string in bytes. Use a number between 32 and 65535. The default is 256.

maxurls

Specify maximum size of URL buffer. Use a number between 32 and 65535. The defaults is 256.

maxdocsize

Specify the maximum document size. Use a number between 256 and 2,147,483,647 bytes (2 gigabytes). The defaults is 2,000,000.

http_proxy

Specify the host name of http proxy server. Optionally specify port number with a colon in the form hostname:port

ftp_proxy

Specify the host name of ftp proxy server. Optionally specify port number with a colon in the form hostname:port.

no_proxy

Specify the domain for no proxy server. Use a comma separated string of up to 16 domain names.

 
 
索引建立过程:
首先建立自己的URL_DATASTORE选项。如下指定了代理,Timeout时间。
begin
 ctx_ddl.create_preference('URL_PREF','URL_DATASTORE');
ctx_ddl.set_attribute('URL_PREF','Timeout','300');
end;
 
建立存储Url路径的表
 
create table urls(id number primary key, url varchar2(2000));
insert into urls values(1,'http:// http://intranet-center/');
insert into urlsvalues(2,'http://founderweb:9080/default.jsp');
commit;
 
建立索引,索引Html文件可以使用HTML_SECTION_GROUP
create index datastores_text on urls ( url ) 
  indextype is ctxsys.context 
  parameters ( 'Datastore URL_PREF Lexer my_lexer Section group ctxsys.HTML_SECTION_GROUP' ); 

 

select token_text from dr$datastore_text$i;
 
关于建立以及同步索引的时候发生的错误信息可以从ctx_user_index_errors用户视图中查看。
 
 
 
 
 
 
 
 

解锁ctxsys用户,在system用户下操作  

alter user ctxsys account unlock;  

将ctx_ddl包的操作权限赋给用户  

grant execute on ctx_ddl to 用户;  

GRANT   ctxapp TO 用户;

GRANT EXECUTE ON ctxsys.ctx_cls TO 用户;

GRANT EXECUTE ON ctxsys.ctx_ddl TO 用户;

GRANT EXECUTE ON ctxsys.ctx_doc TO 用户;

GRANT EXECUTE ON ctxsys.ctx_output TO 用户;

GRANT EXECUTE ON ctxsys.ctx_query TO 用户;

GRANT EXECUTE ON ctxsys.ctx_report TO 用户;

GRANT EXECUTE ON ctxsys.ctx_thes TO 用户;

GRANT EXECUTE ON ctxsys.ctx_ulexer TO 用户;

 

创建词法分析器
 ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
 
建立存储选项参数:
exec CTX_DDL.CREATE_PREFERENCE('my_datastore_prefs', 'FILE_DATASTORE' );
FILE_DATASTORE:检索本地文档
<删除:ctx_ddl.drop_preference(‘my_datastore_prefs’);>
Exec CTX_DDL.SET_ATTRIBUTE('my_datastore_prefs', 'path', 'D:\sss' );
D:\sss:检索全路径
 
 
建表和插入数据:
CREATE TABLE mydocs( id NUMBER PRIMARY KEY, title VARCHAR2(255), thefile 
VARCHAR2(255) );
INSERT INTO mydocs( id, title, thefile ) VALUES( 1, 'Document1', 'D:\sss\WordDoc1.doc');
INSERT INTO mydocs( id, title, thefile ) VALUES( 2, 'Document2', ' D:\sss\WordDoc2.doc' );
INSERT INTO mydocs( id, title, thefile ) VALUES( 3, 'Document3', ' D:\sss\WordDoc3.doc' );
COMMIT;
 
 
建立索引:
CREATE INDEX mydocs_index ON mydocs(thefile) INDEXTYPE IS ctxsys.context   PARAMETERS('datastore my_datastore_prefs Filter ctxsys.inso_filter Lexer my_lexer');
 
 
 
 
索引同步:
ctx_ddl.sync_index(myindex);
 
 
删除过期索引:
ctx_ddl.optimize_index(myidx, 'FULL');


oracle 发现全文检索不支持文件名为汉字的文件,以及office 07以上的版本    有什么解决的好方案请大家分享下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值