全文索引
背景介绍:很多时候需要根据key words关键字去匹配对应的值,对于大量的数据而已,如果使用like,或者instr函数,速度则会很慢,这个时候,全文检索对比其他的模糊查询,有着明显的速度优势。但是因为分词,所以会占用的一定的空间。如果空间足够以及对速度有一样的需求,可以考虑全文检索。根据自身的需求而定。
Oracle的全文检索实现逻辑,通过lexer词法分析器,讲把值的term找出来。记录在一组的DR$开头的表里面(主要是DR$xxxI表),主要记录term的位置,frequency频率,hash等信息,oracle根据谓词,找到对应的term。
主要介绍三种自然语言的分析器
basic_lexer(默认的分析器):主要针对英语。有较高的处理效率,因为它只认空格和标点,所以对于汉语没有空格的情况不会分词
chinese_vgram_lexer: 专用汉语分析器,支持所有汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8)因为采用了分词的方法,可以查到所有的分词,效率差
chinese_lexer: 新汉语分析器,只支持utf8, 支持识别大部分的分词,但是会过滤掉很多无法识别的分词,因为这个原因也导致效率很高,如果数据库是zhs16gbk字符集,则只能使用Chinese vgram lexer.
Note:追求效率那么使用CHINESE_LEXER,如果追求准确度那么使用CHINESE_VGRAM_LEXER(推荐使用chinese_vgram_lexer)
建立步骤
全文检索的大部分都在CTX包里面
查看用户
select * from dba_users WHERE username='CTXSYS'
查看角色
select * from dba_roles WHERE ROLE = 'CTXAPP'
解锁
ALTER USER CTXSYS ACCOUNT UNLOCK;
角色授权:
GRANT CTXAPP TO TEST
根据需求选择lexer制定文本解析器
创建文本解析器
BEGIN
ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
END;
/
删除文本解析器
BEGIN
ctx_ddl.drop_preference ('my_lexer');
end;
创建全文索引
CREATE INDEX ind_lot ON lot(lot_id) indextype is ctxsys.context parameters('lexer my_lexer');
删除全文索引
Drop index index_name force
索引同步维护
begin
ctx_ddl.sync_index('ind_lot');
ctx_ddl.optimize_index('ind_lot','full');
END;
用法
ctx_ddl.sync_index(
CTX_WEB_ACION_BASIC IN VARCHAR2 DEFAULT NULL
memory IN VARCHAR2 DEFAULT NULL,
P2014_1010_1020 IN VARCHAR2 DEFAULT NULL
parallel_degree IN NUMBER DEFAULT 1)
ctx_ddl.sync_index('ind_lot','500M','p1')
也可以定时run job
Sync同步job
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''ind_lot'');',
SYSDATE, 'SYSDATE + (1/24/6)');
commit;
END;
Optimize索引
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''ind_lot'',''FULL'');',
SYSDATE, 'SYSDATE + 1');
commit;
测试查看数据
select * from lot where contains(lot_id,'北京')>0
补充:有时候需要指定过掉一些词(不会为这些词创建全文索引)
指定过滤词
exec ctx_ddl.create_stoplist('北京')