oracle text全文检索

Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle称为 term)找出来,记录在一组以dr$开头的表中,同时记下该term出现的位置、次数、hash值等信息。检索时,Oracle从这组表中查找相应的 term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。

首先查看有没有ctxsys用户,因为oracle全文检索需要ctxsys用户的支持,其实主要是需要使用ctxsys用户下的ctx_ddl这个包,这个包中绝大部分过程的创建都与全文检索有关。:

select * from dba_users WHERE username=’CTXSYS’;

然后创建oracle分析器,类似于solr的分词,将需要检索的记录,按照一定的方式进行词组拆分,然后存放在索引表中。检索的时候根据索引表中存放的拆分词组,对传入的关键字进行匹配,并返回匹配结果:

BEGIN
ctx_ddl.create_preference (‘my_lexer’, ‘chinese_vgram_lexer’);
END;

‘my_lexer’是自己设定的分析器的名称,
‘chinese_vgram_lexer’是oracle text分析器中的一种。

oracle text中的分析器有3种:

basic_lexer:只能根据空格和标点来进行拆分。比如“中国重庆”,只能拆分为“中国重庆”一个词组;
chinese_vgram_lexer:专门的汉语分析器,按字单元进行拆分,比如“中国重庆”,可以拆分为“中”、“中国“、”国重”、“重庆”、“庆”五个词组。这种方式的好处是能够将所有有可能的词组全部保存进索引表,使得数据不会遗漏;
chinese_lexer:一种新的汉语分析器,能够认识大部分常用的汉语词汇,并按常用词汇进行拆分存储。比如“中国重庆”,只会被拆分为“中国”、“重庆”两个词组。

创建索引:

CREATE INDEX Review_Context_Index ON BOOK_REVIEW_CONTEXT(Review_Text) indextype is ctxsys.context parameters(‘lexer my_lexer’);

意思是给BOOK_REVIEW_CONTEXT表中的Review_Text字段创建一个名为Review_Context_Index的索引,使用my_lexer这个分析器。

进行全文检索:

SELECT Title FROM BOOK_REVIEW_CONTEXT WHERE contains(REVIEW_TEXT, ‘生产 AND 原料使用的许可 AND 冬虫夏草’)>0;

使用这种句式就可以进行全文检索,AND的意思是在REVIEW_TEXT查找同时包含”生产”“原料使用的许可”“冬虫夏草”的记录,关于这种用法,可以网上查阅一下。

另外,使用context文本索引时,当表中进行增删改时,索引不会自动更新,为了让索引与表同步,应当执行ctx_ddl程序包的sync_index过程,也可以在指定时间段内进自动维护。

begin
ctx_ddl.sync_index(‘Review_Context_Index’);
ctx_ddl.optimize_index(‘Review_Context_Index’,’full’);
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值