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
URL_DATASTORE 参数
URL_DATASTORE
的一些参数,其中timeout,proxy是经常用到的:
索引建立过程:
首先建立自己的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
关于建立以及同步索引的时候发生的错误信息可以从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以上的版本 有什么解决的好方案请大家分享下