Oracle Text 文本检索技术---以Blob字段和普通字段为例

来源:互联网 发布:华为网络在线客服 编辑:程序博客网 时间:2024/05/30 04:21

Oracle text译为全文检索技术,是智能信息管理的关键技术之一,Oracle Text作为Oracle9i的一个组件(以上版本好像都支持),提供了强大的全文检索功能,本文用Oracle 12 C做后台数据库,就可以充分利用其全文检索技术,构建复杂的大型文档管理系统。本文主要介绍了Oracle Text的体系结构及其使用。

Oracle Text的体系结构如下:
这里写图片描述

我们在看看Oracle Text主要逻辑如下:

这里写图片描述

Oracle Text 索引文档时所使用的主要参数如下:
1) 数据存储逻辑(DATASTORE) 搜索表的所有行,并读取列中的数据。通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。例如,URL_DATASTORE 将列数据作为 URL 使用。
2) 过滤器(FILTER) 提取文档数据并将其转换为文本表示方式。存储二进制文档 (如 Word 或 Acrobat 文件) 时需要这样做。过滤器的输出不必是纯文本格式 – 它可以是 XML 或 HTML 之类的文本格式。
3) 分段器(SECTIONER) 提取过滤器的输出信息,并将其转换为纯文本。包括 XML 和 HTML 在内的不同文本格式有不同的分段器。转换为纯文本涉及检测重要文档段标记、移去不可见的信息和文本重新格式化。
4) 词法分析器(Lexer) 提取分段器中的纯文本,并将其拆分为不连续的标记。既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。
5) 索引引擎(Indexing Engine) 提取词法分析 器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。倒排索引存储标记和含有这些标记的文档。

从以上两部分是简单的对Oracle Text做来一个介绍,接下来让我们一步一步的来学习如何使用Oracle Text功能

要实现全文检索需要

1:你的数据库支持 Oracle Text功能。首先检查数据库中是否有CTXSYS用户和CTXAPP脚色,其实主要是需要使用ctxsys用户下的ctx_ddl这个包,这个包中绝大部分过程的创建都与全文检索有关。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。你必须修改数据库以安装这项功能。 默认安装情况下,ctxsys用户是被锁定的,

先用system账户登录去解锁这功能(如果未解锁)

alter user ctxsys account unlock;  

接着我们去给用户授权

grant execute on ctx_app to C##koalagrant execute on ctx_ddl to C##koala;  

致此,我们的数据库准备工作就完成了

2:创建词法分析器(lexer):
Oracle text词法的分析器,是将检索的记录,按照一定的方式进行词组拆分,然后存放在索引表中。检索的时候根据索引表中存放的拆分词组,对传入的关键字进行匹配,并返回匹配结果。

  • basic_lexer:只能根据空格和标点来进行拆分。比如“中国重庆”,只能拆分为“中国重庆”一个词组
  • chinese_vgram_lexer:专门的汉语分析器,按字单元进行拆分,比如“中国重庆”,可以拆分为“中”、“中国“、”国重”、“重庆”、“庆”五个词组。这种方式的好处是能够将所有有可能的词组全部保存进索引表,使得数据不会遗漏。
  • chinese_lexer:一种新的汉语分析器,能够认识大部分常用的汉语词汇,并按常用词汇进行拆分存储。比如“中国重庆”,只会被拆分为“中国”、“重庆”两个词组。
   当我们使用: select * from ctx_preferences
   查询可知,系统默认只有英文的   词法分析器,所以我们需要建立一个中文的
exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');  

创建一个chinese_vgram_lexer的分析器,名称为my_lexer

3:创建索引

create index BLOB_TEST_INDEX on blob_test(name) indextype is CTXSYS.CONTEXT parameters('lexer my_lexer');  

在此之前,你可以加入模糊查询 wordlist

ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST');ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE');ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH',1);ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', 5);ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');

也可以加入屏蔽词 stoplist

exec ctx_ddl.create_stoplist('my_stoplist');  ctx_ddl.add_stopword('my_stoplist','有限公司');  ctx_ddl.add_stopword('my_stoplist','股份有限公司');  

如果你想让模糊查询和屏蔽词一起加入你的索引里面 ,你只需要这样做

create index BLOB_TEST_INDEX on blob_test(name) indextype is CTXSYS.CONTEXT parameters('lexer my_lexer stoplist my_stoplist wordlist mywordlist'); 

此时索引就完成了,索引完成后你会发现你的数据库会多四张表

其中最重要是的如下表:
这里写图片描述

这里你可以看到你建立的中文索引的内容

最后使用contains进行中文索引

select * from BlOB_TEST where contains(name,'中国')>0;  

进一步优化可以写成这样

select score(1),y.* from BLOB_TEST y where contains(name,'中国',1)>0 order by score(1) desc;  

这里的score是oracle全文检索对关键字的匹配程度所计算的分数,contains里的最后一个参数“1”就是对这个分数的一个标识

4: 索引同步
当我们需要修改BLOB_TEST表中的数据,比如添加、删除、更新等操作时,BLOB_TEST索引是不会同步更新数据的,需要我们在程序中手动的更新,可以写一个oracle的触发器,当添加、删除、修改操作时,进行索引更新。也可以定时进行更新。

exec ctx_ddl.sync_index('BLOB_TEST_INDEX')  

索引优化

exec ctx_ddl.optimize_index('BLOB_TEST_INDEX','full')  

5:文本查询

select score(1),y.* from blob_test y where contains(word,'几点',1)>0 order by score(1) desc; 

这里写图片描述

  contains函数提供强大的查询功能,”与”、”或”关系,相近(near ;)和排除(not ~)等功能,更方便的是它还可以根据某一关键词查询不同语种的文本,当然,这要事先设定词典。

还可以使用about方式查询:

SELECT SCORE(1) title from news WHERE CONTAINS(text, 'about(politics)', 1) > 0;

这里写图片描述

ABOUT查询增加了某查询所返回的相关文档的数目。在英语中,ABOUT 查询可以使用索引的主题词组件,该组件在默认情况下创建。这样,运算符将根据查询的概念返回文档,而不是仅依据所指定的精确单词或短语。例如,以下查询将查找文本列中关于主题 politics 的所有文档,而不是仅包含 politics 一词的文档

以上都是对Oracle Text技术的使用,话说写文档真的很费时间,但是收获确实很大!

1 0
原创粉丝点击