快速使用oracle的全文检索

来源:互联网 发布:河下水希画工知乎 编辑:程序博客网 时间:2024/04/29 12:00

1.给你的数据库用户赋权
SQL> grant ctxapp to <用户>;
SQL> grant execute on ctxsys.ctx_ddl to <用户>;
2.建索引
注意:把 <aaa> 换成表空间的名字。最好新建一个,这是用来存放text index (全文检索索引)的
begin
ctx_ddl.create_preference('自定义_lexer','CHINESE_VGRAM_LEXER');
ctx_ddl.create_preference('自定义_store','BASIC_STORAGE');
ctx_ddl.set_attribute('自定义_store', 'I_TABLE_CLAUSE',
       'tablespace 表空间名称');
ctx_ddl.set_attribute('自定义_store', 'K_TABLE_CLAUSE',
       'tablespace 表空间名称');
ctx_ddl.set_attribute('自定义_store', 'R_TABLE_CLAUSE',
       'tablespace 表空间名称');
ctx_ddl.set_attribute('自定义_store', 'N_TABLE_CLAUSE',
       'tablespace 表空间名称');
ctx_ddl.set_attribute('自定义_store', 'I_INDEX_CLAUSE',
       'tablespace 表空间名称');
ctx_ddl.set_attribute('自定义_store', 'P_TABLE_CLAUSE',
       'tablespace 表空间名称');
end;
/
CREATE INDEX 索引名称
    ON 表名(列名) INDEXTYPE IS CTXSYS.CONTEXT
    PARAMETERS('LEXER 自定义_lexer
                STORAGE 自定义_store
                MEMORY 50M');    //如果内存2g的话可改为100M
3.索引同步与优化(注意:text index 与普通索引不同,不是实时的)
SQL>ctxsys.ctx_ddl.sync_index('CTX_DEVICE_NOTICE_EVENT','10M');  //如果内存2g的话可改为100M,用于同步索引,要跟一段时间执行一次,比如15分钟.
SQL>ctxsys.ctx_ddl.optimize_index('CTX_DEVICE_NOTICE_EVENT','FULL');  //用于优化索引,一般一天执行一次就行.

4.查询方法
4.1
select * from DEVICE_NOTICE_EVENT
    where contains(SOURCE_NAME,'aaa')>0
等价于原来的
select * from DEVICE_NOTICE_EVENT
    where SOURCE_NAME like '%aaa%'
4.2
select * from DEVICE_NOTICE_EVENT
    where contains(SOURCE_NAME,'aaa & bbb')>0
等价于原来的
select * from DEVICE_NOTICE_EVENT
    where SOURCE_NAME like '%aaa%'  and SOURCE_NAME like '%bbb%'
4.3
select * from DEVICE_NOTICE_EVENT
    where contains(SOURCE_NAME,'aaa | bbb')>0
等价于原来的
select * from DEVICE_NOTICE_EVENT
    where SOURCE_NAME like '%aaa%'  or SOURCE_NAME like '%bbb%'