oracle全文检索同步,ORACLE全文检索技术应用

ORACLE全文检索技术在Oracle8.0.x 中称为ConText ;在Oracle8i 中称为interMedia Text ;Oracle9i 中称为Oracle Text。

Oracle Text 的应用领域有很多:

1) 搜索文本:需要快捷有效搜索文本数据的应用程序

2) 管理多种文档:允许搜索各种混和文档格式的应用程序,包括ord,excel,lotus 等

3) 从多种数据源中检索文本:不仅来自Oracle 数据库中的文本数据,而且可以来自Internet和文件系统的文本数据

4) 搜索XML 应用程序[@more@]

1、建立全文检索索引的语法

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];

2、Oracle Text 全文检索索引将文本打碎分成很多的记号(token).例如文本‘I Love www.itpub.net’将会被分成I ,LOVE,WWW,ITPUB,NET 这样的记

号(token)。

3、在索引建好后,我们可以在该用户下查到Oracle 自动产生了以下几个表(假设索引名为myindex):DR$myindex$I、DR$myindex$K、

DR$myindex$R、DR$myindex$N 其中DR$myindex$I表最重要

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 要建在和表同一个用户下) :

-- sync:

VARIABLE jobno number;

BEGIN

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''ind_dept_dname'');',SYSDATE, 'SYSDATE + (1/24/4)');

commit;

END;

-- optimizer

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 天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。

8、利用全文检索技术搜索文本

不使用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;

-----------------------常用办法(使用INSTR 函数和LIKE 操作符)---------------------------------------

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;

--or

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值