我的开发环境:Oracle 9i,Window Server 2003
(1)正确安装Oracle 9i企业版,Oracle9i企业版在安装的时候就已经默认提供了全文索引支持。如果你的Oracle还没有安装,请先安装一下,至于怎样安装,这里不做讨论,请Google一下。
(2)Oracle9i默认情况下会把ctxsys用户锁定,请以DBA身份登陆Oracle,把用户ctxsys解锁,并修改其密码为ctxsys,以便于我们后面登陆Text Manager
(3)进入Oracle的text manager,点程序->Oracle-OracleHome92->Enterprise Manager Console。选独立启动,然后选工具栏最下面的应用程序->text Manager,这时会要求您输入用户名和密码,用户名ctxsys,密码ctxsys
(4)选择首选项——〉语言指定器——〉CTXSYS,选一个点类似创建,输入指示器的名字如chinese_lexer,选择lexer下的chinese_vgrnm_lexer 。
(5)建立索引,在索引上点右键,然后选创建CONTEXT索引,这里要注意方案要选择您自己的表空间,如我有个表SZPOI在表空间SUZHOU中,现在我要对该表的UNITNAME字段建立全文索引,那么方案选suzhou,表选szpoi,字段选unitname,首选项中选择chinese_lexer 。
这样全文检索就建好了,并用chinese_vgram_lexer作为分析器。
(6)如何查询数据。索引建立以后,我们就可以对该表进行全文索引查询了,查询语句如下:
SELECT score(1),t.unitname,t.objectid,t.eminx,t.eminy,t.mpfullname,t.dianhua FROM szpoi t WHERE contains (unitname, '规划局,吴中分局', 1) > 0 order by score(1) desc
这个语句的意思是在表szpoi中查询unitname包含“规划局”和“吴中分局”两个关键字的记录,并按匹配度从高到低排序。
大功告成了吗?没有!
接着我们还要建立两个job来维护和优化索引。
维护:
begin
sys.dbms_job.submit(job => :job,
what => 'ctx_ddl.sync_index(''SZPOI_UNITNAME_INDEX'');',
next_date => to_date('23-05-2008 13:54:57', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE + (1/24/4)');
commit;
end;
优化:
begin
sys.dbms_job.submit(job => :job,
what => 'ctx_ddl.optimize_index(''SZPOI_UNITNAME_INDEX'',''FULL'');',
next_date => to_date('23-05-2008 14:03:02', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE + 1');
commit;
end;