oracle全文检索(oracle text)记录


1.全文检索和普通检索的区别

不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作:

SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0;SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';
有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候。然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限,因此对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能。

附:这里顺带记录一下INSTR和LIKE:

Oracle中,可以使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符。其语法为:Instr(string, substring, position, occurrence)。

string:代表源字符串(写入字段则表示此字段的内容)。

substring:代表想从源字符串中查找的子串。

position:代表查找的开始位置,该参数可选的,默认为1。

occurrence:代表想从源字符中查找出第几次出现的substring,该参数也是可选的,默认为1。

position 的值为负数,那么代表从右往左进行查找。

instr和like的性能比较

其实从效率角度来看,谁能用到索引,谁的查询速度就会快。

like有时可以用到索引,例如:name like ‘李%’,而当下面的情况时索引会失效:name like ‘%李’。所以一般我们查找中文类似于‘%字符%’时,索引都会失效。与其他数据库不同的是,oracle支持函数索引。例如在name字段上建个instr索引,查询速度就比较快了,这也是为什么instr会比like效率高的原因。

注:instr(title,’手册’)>0 相当于like‘%手册%’

instr(title,’手册’)=0 相当于not like‘%手册%’

2.设置全文检索
步骤步骤一:检查和设置数据库角色

首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能(10G默认安装都有此用户和角色)。你必须修改数据库以安装这项功能。默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys的用户。
步骤二:赋权
步骤三:创建分析器(lexer)
步骤四:创建索引
步骤五:测试


--创建oracle全文检索
--1.解锁ctxsys用户,在system用户下操作
alter user ctxsys account unlock;
--2.将ctx_ddl包的操作权限赋给用户,在system用户下操作
grant execute on ctx_ddl to tfyj;
--3.创建分析器,在tfyj用户下
exec ctx_ddl.create_preference ('tfyj_lexer', 'chinese_vgram_lexer');
--4.创建过滤词组(没用到)
exec ctx_ddl.create_stoplist('my_stoplist');  
--5.自定义过滤词组(没用到)
ctx_ddl.add_stopword('my_stoplist','有限公司');   
ctx_ddl.add_stopword('my_stoplist','股份有限公司'); 
--6.创建索引,在台风预警用户下创建
create index tfyj_facility_INDEX on f_tower(TOWER_NAME) indextype is CTXSYS.CONTEXT parameters('lexer tfyj_lexer');  

--7.查询测试
select score(1),t.* from f_tower t where contains(tower_name,'110kv  濠保线 N8 ',1)>0 order by score(1) desc;  


详情http://yupengcc.iteye.com/blog/1267205

猜你喜欢

转载自dong-shuai22-126-com.iteye.com/blog/1684388
今日推荐