oracle全文索引(全文检索)的介绍,使用和创

全文索引

背景介绍:很多时候需要根据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('北京') 





你可能感兴趣的:(oracle,sql,索引)