ORACLE 全文检索实例

以下是本人经过测试没有问题,按步骤逐步操作即可。
本人用oracle10g测试,注意nvarchar2()类型不支持索引。

/******************************************
* 全文说明:
* 1).tls4cs为应用用户
* 2).当前数据库中必须有CTXSYS用户和CTXAPP角色
******************************************/

/*1、使用具有sysdba权限的用户登录/
grant connect,resource to tls4cs;
grant ctxapp to tls4cs;
alter user tls4cs default role all;

/*2、通常ctxsys处于锁定状态,需要解锁ctxsys用户/
alter user ctxsys account unlock;

/*3、对象权限/
grant execute on ctx_ddl to tls4cs;

/*4、使用应用用户tls4cs连接,设置搜索器类型/
BEGIN
ctx_ddl.create_preference ('main_lexer','CHINESE_LEXER');
ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST');
ctx_ddl.create_preference('mymds', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE'); ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH',1);
ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', 5);
ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');
ctx_ddl.set_attribute('mymds', 'columns', 'content,title');
END;
/

/***********************************************************
* 搜索器说明:
* 1)ctx_ddl.create_preference用于创建词法分析器名,他的名称为'main_lexer'
* 2)词法分析器有3种类型:
* 'CHINESE_VGRAM_LEXER'仅用于中文,提取标示符更大,无效标示符较多;
* 'CHINESE_LEXER' 仅用于中文,效率高一些更准确可靠一些;建议使用
* 'BASIC_LEXER'仅用于英文;
* 3)定义相关词表“BASIC_WORDLIST’;
* 4)数据存储分三种:
* 'DIRECT_DATASTORE'默认存储方式;
* 'URL_DATASTORE'用于数据源通过url的方式指定;
* 'MULTI_COLUMN_DATASTORE'用于多数据源使用同一个索引的情况;
* 5)'PREFIX_INDEX'词表禁用还是启动;
* 6)'PREFIX_MIN_LENGTH'词表的最小长度;
* 7)'PREFIX_MAX_LENGTH'词表的最大长度;
* 8)'SUBSTRING_INDEX'词组是否可以分解;
***********************************************************/

/*5、对某列建立文档CONTEXT索引,并且指定搜索器/过滤器/单词列表/
CREATE INDEX idx_aritcle_content ON TABTEST(CONTENT)
indextype is ctxsys.context parameters
('DATASTORE mymds FILTER CTXSYS.INSO_FILTER LEXER main_lexer WORDLIST mywordlist');

/*6、执行查询/
select * from TABTEST where contains(CONTENT,'检索,内容,项目')>0
//也加入一些表达式
select * from TABTEST where contains(CONTENT,'检索 or 内容 or 项目')>0
//同时可以通过准确度排序score(1),内容中1代表,两单词间距不超过10个单词的文本。
Select score(1),tb.id,tb.title,tb.content,tb.createdate from TABTEST tb where contains(CONTENT,'检索,内容',1)>0 order by score(1) desc

/*7、索引同步/
CREATE or replace procedure cont_sync_index as
BEGIN
ctx_ddl.sync_index('idx_aritcle_content');
END;
/
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'cont_sync_index();',
SYSDATE, 'SYSDATE + (1/24/4)');
commit;
END;
/

/***********************************************************
* 同步任务说明:
* 1)通过任务执行idx_aritcle_content同步索引;
* 2) SYSDATE + (1/24/4) 代表15分钟后执行
***********************************************************/

/*8、索引优化/
CREATE or replace procedure cont_optimize_index as
BEGIN
ctx_ddl.optimize_index('idx_aritcle_content','FULL');
END;
/

VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'cont_optimize_index();',
SYSDATE, 'SYSDATE + 1');
commit;
END;
/

/***********************************************************
* 优化任务说明:
* 1)通过任务执行cont_optimize_index优化索引;
* 有三种优化参数以下官方解释:
* The “FAST” mode compacts fragmented rows but does not remove old data
* The “FULL” mode optimizes either the entire index or a portion of it, with old data removed
* The “TOKEN” mode perfoms a full optimization for a specific token
* 建议用full
* 2) SYSDATE + 1 代表从明天开始夜间12点执行;
***********************************************************/

/***********************************************************
* 任务时间对照表:
* 描述 INTERVAL参数值
* 每天午夜12点 'TRUNC(SYSDATE + 1)'
* 每天早上8点30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
* 每星期二中午12点 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
* 每个月第一天的午夜12点 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
* 每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
* 每星期六和日早上6点10分
* 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
***********************************************************/

缺优点:
1)如果建立数据量非常大,建立索引会比较慢,10条数据量用5个小时,还好是增量建索引。
如果每天上传数据量在2000条,同步大约需要索引5分钟。定期做优化,减少索引中零碎分词,能大大提高检索速度。
2)过滤器中能对特殊字符进行处理,如下#-+_@%^!!,@#¥&*()()。
3)压力全部在数据库服务器上。
4)搜索文字准确率高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值