zt http://blog.163.com/try_boy/blog/static/17868656220121121752184/php
不使用Oracle text功能,也有不少方法能够在Oracle数据库中搜索文本.可使用标准的INSTR函数和LIKE操做符实现。
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0;
SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';
有不少时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而经过这些文本定位的方法将致使全表扫描,对资源来讲消耗比较昂贵,并且实现的搜索功能也很是有限,所以对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能 创建全文检索的步骤步骤一 检查和设置数据库角色首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。若是没有这个用户和角色,意味着你的数据库建立时未安装intermedia功能。你必须修改数据库以安装这项功能。 默认安装状况下,ctxsys用户是被锁定的,所以要先启用ctxsys的用户。 步骤二 赋权 在ctxsys用户下把ctx_ddl的执行权限赋于要使用全文索引的用户,例: 算法
步骤三 设置词法分析器(lexer)
Oracle实现全文检索,其机制其实很简单。即经过Oracle专利的词法分析器(lexer),将文章中全部的表意单元(Oracle 称为 term)找出来,记录在一组 以dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每一个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle 针对不一样的语言提供了不一样的 lexer, 而咱们一般能用到其中的三个:
n basic_lexer: 针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率太高已经失去检索意义的单词做为‘垃圾’处理,如if , is 等,具备较高的处理效率。但该lexer应用于汉语则有不少问题,因为它只认空格和标点,而汉语的一句话中一般不会有空格,所以,它会把整句话做为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。
n chinese_vgram_lexer: 专门的汉语分析器,支持全部汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成以下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。能够看出,这种分析方法,实现算法很简单,而且能实现‘一网打尽’,但效率则是差强人意。
n chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器因为不认识经常使用的汉语词汇,所以分析的单元很是机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,所以这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分经常使用汉语词汇,所以能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大 提升了效率。可是它只支持 utf8, 若是你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer.
若是不作任何设置,Oracle 缺省使用basic_lexer这个分析器。要指定使用哪个lexer, 能够这样操做:
第一. 当前用户下下创建一个preference(例:在pomoho用户下执行如下语句) 数据库
第二. 在创建全文索引索引时,指明所用的lexer: oracle
这样创建的全文检索索引,就会使用chinese_vgram_lexer做为分析器。
步骤四 创建索引
经过如下语法创建全文索引 dom
步骤五 使用索引
使用全文索引很简单,能够经过:
select * from pubmenu where contains(menuname,'上传图片')>0
全文索引的种类
创建的Oracle Text索引被称为域索引(domain index),包括4种索引类型:
l CONTEXT
2 CTXCAT
3 CTXRULE
4 CTXXPATH
依据你的应用程序和文本数据类型你能够任意选择一种。
对多字段创建全文索引
不少时候须要从多个文本字段中查询知足条件的记录,这时就须要创建针对多个字段的全文索引,例如须要从pmhsubjects(专题表)的subjectname(专题名称)和briefintro(简介)上进行全文检索,则须要按如下步骤进行操做:
? 建议多字段索引的preference
以ctxsys登陆,并执行: 函数
全文索引的维护
对于CTXSYS.CONTEXT索引,当应用程序对基表进行DML操做后,对基表的索引维护是必须的。索引维护包括索引同步和索引优化。
在索引建好后,咱们能够在该用户下查到Oracle自动产生了如下几个表:(假设索引名为myindex):
DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,能够查询一下该表,看看有什么内容: 优化
这里就不列出查询接过了。能够看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里,包括term出现的位置、次数、hash值等。当文档的内容改变后,能够想见这个I表的内容也应该相应改变,才能保证Oracle在作全文检索时正确检索到内容(由于所谓全文检索,其实核心就是查询这个表)。这就用到sync(同步) 和 optimize(优化)了。
同步(sync): 将新的term 保存到I表;
优化(optimize): 清除I表的垃圾,主要是将已经被删除的term从I表删除。
当基表中的被索引文档发生insert、update、delete操做的时候,基表的改变并不能立刻影响到索引上直到同步索引。能够查询视图CTX_USER_PENDING查看相应的改动。例如: blog
同步和优化方法: 可使用Oracle提供的ctx_ddl包同步和优化索引
一. 对于CTXCAT类型的索引来讲, 当对基表进行DML操做的时候,Oracle自动维护索引。对文档的改变立刻反映到索引中。CTXCAT是事务形的索引。
索引的同步
在对基表插入,修改,删除以后同步索引。推荐使用sync同步索引。语法: 索引
指定一个大的内存时候能够加快索引效率和查询速度,且索引有较少的碎片
part_name 同步哪一个分区索引。
parallel_degree 并行同步索引。设置并行度。
例如:
同步索引myindex:Exec ctx_ddl.sync_index ('myindex');
实施建议:建议经过oracle的job对索引进行同步
索引的优化
常常的索引同步将会致使你的CONTEXT索引产生碎片。索引碎片严重的影响了查询的反应速度。你能够按期优化索引来减小碎片,减小索引大小,提升查询效率。
当文本从表中删除的时候,Oracle Text标记删除的文档,可是并不立刻修改索引。所以,就的文档信息占据了没必要要的空间,致使了查询额外的开销。你必须以FULL模式优化索引,从索引中删除无效的旧的信息。这个过程叫作垃圾处理。当你常常的对表文本数据进行更新,删除操做的时候,垃圾处理是很必要的。
exec ctx_ddl.optimize_index ('myidx', 'full');
实施建议:天天在系统空闲的时候对全文索引进行相应的优化,以提升检索的效率图片