oracle全文检索技术应用

信息来源: IT168

Oracle 8.0.x 中称为ConText ;在Oracle8i 中称为interMedia Text ;Oracle9i 中称为Oracle Text。
Oracle Text 的应用领域有很多:
搜索文本:需要快捷有效搜索文本数据的应用程序
管理多种文档:允许搜索各种混和文档格式的应用程序,包括ord,excel,lotus 等
从多种数据源中检索文本:不仅来自Oracle 数据库中的文本数据,而且可以来自Internet和文件系统的文本数据
搜索XML 应用程序

2、搜索文本
不使用Oracle text 功能,也有很多方法可以在Oracle 数据库中搜索文本.可以使用标准的INSTR 函数和LIKE 操作符实现.
   
   

connect scott / tiger
insert into dept (deptno,dname,loc) values ( ' 50 ' , ' 公安软件事业部 ' , ' 四楼 ' );
insert into dept (deptno,dname,loc) values ( ' 60 ' , ' 社保软件事业部 ' , ' 三楼 ' );
insert into dept (deptno,dname,loc) values ( ' 70 ' , ' 人事部 ' , ' 二楼 ' );
insert into dept (deptno,dname,loc) values ( ' 80 ' , ' 系统集成部 ' , ' 一楼 ' );
commit ;

-----------------------常用办法---------------------------------------
   
   

SELECT * FROM dept WHERE INSTR (dname, ' 软件 ' ) > 0 ;
SELECT * FROM dept WHERE dname LIKE ' %软件% ' ;

-----------------------全文检索办法------------------------------------
   
   

connect ctxsys / ctxsys
BEGIN
-- 设置词法分析器
ctx_ddl.create_preference ( ' my_lexer ' , ' chinese_vgram_lexer ' );
-- 设置储存参数
ctx_ddl.create_preference ( ' mystore ' , ' BASIC_STORAGE ' );
ctx_ddl.set_attribute (
' mystore ' , ' I_TABLE_CLAUSE ' , ' tablespace indx ' );
ctx_ddl.set_attribute (
' mystore ' , ' I_INDEX_CLAUSE ' , ' tablespace indx compress 2 ' );
END ;
connect scott
/ tiger
CREATE INDEX ind_dept_dname
ON dept( dname )
INDEXTYPE
is CTXSYS.CONTEXT
parameters(
' lexer ctxsys.my_lexer storage ctxsys.mystore ' );
SELECT * FROM dept WHERE contains (dname, ' 软件 ' ) > 0 ;
SELECT * FROM dept WHERE contains (dname, ' 软件 or 集成 ' ) > 0 ;
-- 按分值排序
SELECT score ( 1 ), a. * FROM dept a WHERE contains (dname, ' 公安 or 软件 or 事 ' , 1 ) > 0
ORDER BY score ( 1 ) DESC ;

-----------------------简单介绍-------------------------------------------
1、Oracle Text 索引将文本打碎分成很多的记号(token).
例如文本‘I Love www.itpub.net’ 将会被分成I ,LOVE,WWW,ITPUB,NET 这样的记号(token)。
2、在索引建好后,我们可以在该用户下查到Oracle 自动产生了以下几个表:
(假设索引名为myindex):DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N 其中以I表最重要
3、建立索引的语法
   
   

CREATE INDEX [ schema. ] index on [ schema. ] table ( column ) INDEXTYPE
IS ctxsys.context [ ONLINE ]
LOCAL
[ (PARTITION [partition ] [ PARAMETERS('paramstring') ]
[ , PARTITION [partition ] [ PARAMETERS('paramstring') ] ])]
[ PARAMETERS(paramstring) ] [ PARALLEL n ] [ UNUSABLE ] ;

4、如果想在两列(多列)中查找某个单词是否存在这两个列之一。
方法一:在不同的列上建索引
方法二:定制
连接ctxsys,只有ctxsys才能建立MULTI_COLUMN_DATASTORE
   
   

EXEC ctx_ddl.create_preference( ' mymds ' , ' MULTI_COLUMN_DATASTORE ' );
EXEC ctx_ddl.set_attribute( ' mymds ' , ' columns ' , ' dname, loc ' );

连接scott
   
   

CREATE INDEX SCOTT.IND_DEPT_DNAME
ON SCOTT.DEPT(DNAME) INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS (
' DATASTORE CTXSYS.MYMDS LEXER SCOTT.MY_LEXER ' );
SELECT *
FROM dept
WHERE contains (dname, ' 人事 or 四楼 ' ) > 0 ;

5、指定存储参数
学习使用ORACLE TEXT MANAGER;
6、设置词法分析器
学习使用ORACLE TEXT MANAGER;
7、索引维护
对于CTXSYS.CONTEXT 索引,当应用程序对基表进行DML 操作后,对基表的索引维护是必须的。索引维护包括索引同步和索引优化。
当基表中的被索引文档发生insert、update、delete 操作的时候,基表的改变并不能马上影响到索引上直到同步索引。
7.1 同步和优化方法: 可以使用Oracle 提供的ctx_ddl 包同步和优化索引。
同步语法:
   
   

ctx_ddl.sync_index(
idx_name
IN VARCHAR2 DEFAULT NULL
memory
IN VARCHAR2 DEFAULT NULL ,
part_name
IN VARCHAR2 DEFAULT NULL
parallel_degree
IN NUMBER DEFAULT 1 );

idx_name 索引名称
memory 指定同步索引需要的内存。默认是系统参数DEFAULT_INDEX_MEMORY 。指定一个大的内存时候可以加快索引效率和查询速度,且索引有较少的碎片
part_name 同步哪个分区索引。
parallel_degree 并行同步索引。设置并行度。
同步例子:
   
   

insert into dept (deptno,dname,loc) values ( ' 71 ' , ' 销售部 ' , ' 二楼 ' );

使用2M 内存同步索引myindex:
   
   

BEGIN
ctx_ddl.sync_index (
' ind_dept_dname ' , ' 2M ' );
END ;

优化例子:
   
   

BEGIN
ctx_ddl.optimize_index (
' ind_dept_dname ' , ' full ' );
END ;

7.2 使用job 定时同步和优化
用以下的两个job 来完成(该job 要建在和表同一个用户下) :
-- 同步:
   
   

VARIABLE jobno number ;
BEGIN
DBMS_JOB.SUBMIT(:jobno,
' ctx_ddl.sync_index( '' ind_dept_dname '' ); ' ,SYSDATE, ' SYSDATE + (1/24/4) ' );
commit ;
END ;

-- 优化:
   
   

VARIABLE jobno number ;
BEGIN
DBMS_JOB.SUBMIT(:jobno,
' ctx_ddl.optimize_index( '' ind_dept_dname '' , '' FULL '' ); ' ,SYSDATE, ' SYSDATE + 1 ' );
commit ;
END ;

其中, 第一个job 的SYSDATE + (1/24/4)是指每隔15分钟同步一次,
第二个job 的SYSDATE+ 1 是每隔1 天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。


http://forum.eviloctal.com/thread-23137-1-1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值