oracle全文检索(like优化)
oracle全文检索
一、全文检索词法分析类型
1.basic_lexer
针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。
2.chinese_vgram_lexer
专门的汉语分析器,支持所有汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。
3.chinese_lexer
这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大 提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer.
二、全文检索创建
1.创建词法分析器
begin
ctx_ddl.create_preference ('词法分析名称');
ctx_ddl.create_preference ('词法分析名称','chinese_vgram_lexer');--类型
end;
2. 设置词法属性
1)创建词法
begin
ctx_ddl.create_pfaxureference ('词法名称');
ctx_ddl.create_pfaxureference ('词法名称','MULTI_COLUMN_DATASTORE');--DATASTORE指定存储类型
end;
2)指定字段(多字段或者单字段)
begin
ctx_ddl.set_attribute('词法名称','columns','字段1,字段2,字段3,字段4,字段5');
end;
3)其他属性(可查看官方文档)
begin
ctx_ddl.create_preference('词法名称','BASIC_STORAGE');
ctx_ddl.set_attribute('词法名称','I_TABLE_CLAUSE','tablespaces Idx_ctxsy');
ctx_ddl.set_attribute('词法名称','I_INDEX_CLAUSE','tablespace Idx_ctxsy compress 2');
end;
3.创建索引
CREATE INDEX indexname --索引名
ON tablename(字段名称)--表(字段),多字段指定在上方,这里只能指定一个
INDEXTYPE IS ctxsys.CONTEXT --指定索引类型为全文检索
PARAMETERS ('LEXER 分析器名称 sync (on commit) DATASTORE 词法名称') ;
--最后设置全文检索的参数 分析器名称 词法名称,同步更新全文检索sync (on commit)。设置为同步之后就不用单独维护全文检索的更新,不设置同步需单位维护同步,一般为建立job
三、全文检索查询
select * from table_name where contains (column_name,'keyword') >0;
四、删除全文检索
begin
CTX_DDL.drop_preference('词法分析名称');--删除词法分析器
CTX_DDL.drop_preference('词法名称');--删除词法
end;
drop index indexname;--删除索引
五、其他内容
1.检查数据库是否支持全文检索
查看用户中是否存在ctxsys用户
查询角色里是否存在ctxapp角色。
以上两个中的1个不满足(不存在),则说明没有装过全文检索功能。
即使满足也要查看下用户下有没有相应存储过程,如果没有,也得执行下面操作,可以不见表空间,但必须执行
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
@?/ctx/admin/defaults/drdefus.sql
2.手动建立全文检索需要的用户和内容
1)先建立全文检索要使用的空间
sqlplus / as sysdba --进入控制台
create tablespace Idx_ctxsys datafile '/oradata/sg186fx/ctxsys01.dbf size 10240M autoextend on next 32M maxsize 20480M;--创建全文检索使用的表空间
2).创建全文检索使用的用户和角色及相应的包,则需要执行oracle自带的一个脚本:cd $ORACLE_HOME/ctx/admin/catctx.sql
还是在sqlplus中执行:
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
在执行这个脚本的时候,输入了几个参数
第一个参数ctxsys为ctxsys用户的密码
第二个参数Idx_ctxsys为ctxsys用户要使用的表空间
第三个参数temp为ctxsys用户使用的临时表空间
第四个参数nolock为ctxsys用户处于解锁状态。
3)创建完成后,要登录ctxsys用户
connect ctxsys/ctxsys
执行以下脚本:
@?/ctx/admin/defaults/drdefus.sql--(这是个很重要的脚本,创建索引会使用该脚本创建的信息)