Oracle一直致力于全文检索技术的研究,当Oracle9i Rlease2发布之时,Oracle数据库的全文检索技术已经非常完美,Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力。Oracle Text是Oracle9i采用的新名称,在Oracle8/8i中它被称作Oracle interMedia Text。使用Oracle Text,可以方便而有效地利用标准的SQL工具来构建基于文本的新的开发工具或对现有应用程序进行扩展。应用程序开发人员可以在任何使用文本的Oracle数据库应用程序中充分利用Oracle Text搜索,应用范围可以是现有应用程序中可搜索的注释字段,也可是实现涉及多种文档格式和复杂搜索标准的大型文档管理系统。Oracle Text支持Oracle数据库所支持的大多数语言的基本全文搜索功能。
虽然大多数大型数据库都支持全文检索,但Oracle在这方面无疑是最出色的。Oracle能搜索多种格式的文档,如Word,Execl,PowerPoint,Html,PDF等等。但在使用中也发现有遗憾的地方,Oracle Text无论使用何种过滤器(INSO_FILTER或NULL_FILTER)及何种词法分析器(BASIC_LEXER, CHINESE_VGRAM_LEXER还是CHINESE_LEXER)都不能检索出中文内容的文本文档(TXT,RTF)。

1 Oracle Text的体系架构

下图是Oracle Text的体系架构:

图1 Oracle Text的体系架构

Oracle Text 索引文档时所使用的主要逻辑步骤如下:

  (1)数据存储逻辑搜索表的所有行,并读取列中的数据。通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。例如,URL_DATASTORE 将列数据作为 URL 使用。如果对本地文件进行检索,只要指定DATASTORE中FILE_DATASTORE参数为文件的路径即可。

  (2)过滤器提取文档数据并将其转换为文本表示方式。存储二进制文档 (如 Word 或 Acrobat 文件) 时需要这样做。过滤器的输出不必是纯文本格式 -- 它可以是 XML 或 HTML 之类的文本格式。

  (3)分段器提取过滤器的输出信息,并将其转换为纯文本。包括 XML 和 HTML 在内的不同文本格式有不同的分段器。转换为纯文本涉及检测重要文档段标记、移去不可见的信息和文本重新格式化。

  (4)词法分析器提取分段器中的纯文本,并将其拆分为不连续的标记。既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。

  (5)索引引擎提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。倒排索引存储标记和含有这些标记的文档。

归纳起来如下:

  (1)建表并装载文本(包含带有需要检索的文本字段)

  (2)配置索引

  (3)建立索引

  (4)发出查询

  (5)索引维护:同步与优化(将在后面介绍)

 文本装载

  要实现文本的全文检索首先必须把正确的文本加载到数据库表中,默认的建立索引行为要求将文档装载在文本列中,尽管可以用其它方式 (包括文件系统和 URL 形式)存储文档 (在"数据存储"选项进行设置)。默认情况下,系统应该将文档装载在文本列中。文本列可以是VARCHAR2、CLOB、BLOB、CHAR或BFILE。注意,只有在将Oracle7系统移植到Oracle8的情况下才支持用LONG和LONG RAW 这两个相反的列类型存储文本。不能为列类型NCLOB、DATE和NUMBER建立索引。

  关于文档格式,因为系统能为包括HTML、PDF、Microsoft Word和纯文本在内的大多数文档格式建立索引,可以将其中的任何文档类型装载到文本列中(在"过滤器"选项中设置)。有关所支持的文档格式的详细信息,可以参阅Oracle Text User's Guide and Reference 中的附录"Supported Filter Formats"。

  装载方法主要有以下几种:

  (1)SQL INSERT 语句

  (2)ctxload 可执行文件

  (3)SQL*Loader

  (4)从 BFILE 中装载 LOB 的 DBMS_LOB.LOADFROMFILE() PL/SQL 过程

  (5)Oracle Call Interface

 建立索引

  文本装入文本列后,就可以创建Oracle Text索引。文档以许多不同方案、格式和语言存储。因此,每个 Oracle Text 索引有许多需要设置的选项,以针对特定情况配置索引。创建索引时,Oracle Text可使用若干个默认值,但在大多数情况下要求用户通过指定首选项来配置索引。

  每个索引的许多选项组成功能组,称为"类",每个类集中体现配置的某一方面,可以认为这些类就是与文档数据库有关的一些问题。例如:数据存储、过滤器、词法分析器、相关词表、存储等。

  每个类具有许多预定义的行为,称之为对象。每个对象是类问题可能具有的答案,并且大多数对象都包含有属性。通过属性来定制对象,从而使对索引的配置更加多变以适应于不同的应用。

  (1)存储(Storage)类

  存储类指定构成Oracle Text索引的数据库表和索引的表空间参数和创建参数。它仅有一个基本对象:BASIC_STORAGE,其属性包括:I_Index_Clause、I_Table_Clause、K_Table_Clause、N_Table_Clause、P_Table_Clause、R_Table_Clause。

  (2)数据存储(Datastore)类

  数据存储:关于列中存储文本的位置和其他信息。默认情况下,文本直接存储到列中,表中的每行都表示一个单独的完整文档。其他数据存储位置包括存储在单独文件中或以其 URL 标识的 Web 页上。七个基本对象包括:Default_Datastore、Detail_Datastore、Direct_Datastore、File_Datastore、Multi_Column_Datastore 、URL_Datastore、User_Datastore,。

  (3)文档段组(Section Group)类

  文档段组是用于指定一组文档段的对象。必须先定义文档段,然后才能使用索引通过 WITHIN 运算符在文档段内进行查询。文档段定义为文档段组的一部分。包含七个基本对象:AUTO_SECTION_GROUP、BASIC_SECTION_GROUP、HTML_SECTION_GROUP、NEWS_SECTION_GROUP、NULL_SECTION_GROUP、XML_SECTION_GROUP、PATH_SECTION_GROUP。

  (4)相关词表(Wordlist)类

  相关词表标识用于索引的词干和模糊匹配查询选项的语言,只有一个基本对象BASIC_WORDLIST,其属性有:Fuzzy_Match、Fuzzy_Numresults、Fuzzy_Score、Stemmer、Substring_Index、Wildcard_Maxterms、Prefix_Index、Prefix_Max_Length、Prefix_Min_Length。

  (5)索引集(Index Set)

  索引集是一个或多个Oracle 索引 (不是Oracle Text索引) 的集合,用于创建 CTXCAT类型的Oracle Text索引,只有一个基本对象BASIC_INDEX_SET。

  (6)词法分析器(Lexer)类

  词法分析器类标识文本使用的语言,还确定在文本中如何标识标记。默认的词法分析器是英语或其他西欧语言,用空格、标准标点和非字母数字字符标识标记,同时禁用大小写。包含8个基本对象:BASIC_LEXER、CHINESE_LEXER、CHINESE_VGRAM_LEXER、JAPANESE_LEXER、JAPANESE_VGRAM_LEXER、KOREAN_LEXER、KOREAN__MORPH_ LEXER、MULTI_LEXER。

  (7)过滤器(Filter)类

  过滤器确定如何过滤文本以建立索引。可以使用过滤器对文字处理器处理的文档、格式化的文档、纯文本和 HTML 文档建立索引,包括5个基本对象:CHARSET_FILTER、INSO_FILTER INSO、NULL_FILTER、PROCEDURE_FILTER、USER_FILTER。

  (8)非索引字表(Stoplist)类

  非索引字表类是用以指定一组不编入索引的单词 (称为非索引字)。有两个基本对象:BASIC_STOPLIST (一种语言中的所有非索引字) 、 MULTI_STOPLIST (包含多种语言中的非索引字的多语言非索引字表)。

 查询

  建立了索引,就可以使用 SELECT 语句中的 CONTAINS 运算符发出文本查询。使用 CONTAINS 可以进行两种查询:单词查询和ABOUT查询。

  5.1 词查询示例

  词查询是对输入到 CONTAINS 运算符中单引号间的精确单词或短语的查询。在以下示例中,我们将查找文本列中包含 oracle 一词的所有文档。每行的分值由使用标签 1 的 SCORE 运算符选定:

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

  在查询表达式中,可以使用 AND 和 OR 等文本运算符来获取不同结果。还可以将结构性谓词添加到 WHERE 子句中。可以使用 count(*)、CTX_QUERY.COUNT_HITS 或 CTX_QUERY.EXPLAIN 来计算查询的命中 (匹配) 数目。

  5.2 ABOUT查询示例

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

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

 索引维护

  索引建好后,如果表中的数据发生变化,比如增加或修改了记录,怎么办?由于对表所发生的任何DML语句,都不会自动修改索引,因此,必须定时同步(sync)和优化(optimize)索引,以正确反映数据的变化。
在索引建好后,可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex):
DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N

  其中以I表最重要,可以查询一下该表:

select token_text, token_count from DR$ myindex $I where rownum<=20;

  查询结果在此省略。可以看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里,包括term出现的位置、次数、hash值等。当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表)。那么如何维护该表的内容,不能每次数据改变都重新建立索引,这就要用到sync 和 optimize了。

  同步(sync):将新的term 保存到I表;

  优化(optimize):清除I表的垃圾,主要是将已经被删除的term从I表删除。

2实例

 环境配置
操作系统:Win2000 Sever+SP4
内存:256M
数据库:Oracle9i Enterprise Edition Release 9.2.0.1.0+ ZHS16GBK(字符集)
第三方工具:PL/SQL Developer6.03

 步骤:
1. 要使用Oracle Text技术,当前数据库中必须有CTXSYS用户和CTXAPP角色。Orcale9i建立数据库时,已经创建了CTXSYS和CTXAPP。
2. 创建测试用户:
用system用户登录。
SQL>create user wang identified by wang;
SQL>alter user wang default tablespace EXAMPLE;
SQL> grant connect,resource to wang;
SQL> grant ctxapp to wang;
SQL> alter user wang default role all;

3. 创建表:
用wang用户登录。
SQL> create table mytest ( tid number primary key, fname varchar2(100), btext BLOB)

4. 录入数据:
用system用户登录
--创建目录(数据库服务器)
SQL> create or replace directory BLOB_FILE_DIR as 'd:test';
SQL> grant read on directory BLOB_FILE_DIR to wang;
用wang用户登录
--创建过程
CREATE OR REPLACE PROCEDURE insert_file (TID number,FILENAME VARCHAR2) IS
F_LOB BFILE;
B_LOB BLOB;
BEGIN
INSERT INTO MYTEST(tid,fname,btext)
VALUES (TID,FILENAME,EMPTY_BLOB ()) RETURN btext INTO B_LOB;
F_LOB:= BFILENAME ('BLOB_FILE_DIR', FILENAME);
DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY);
DBMS_LOB.LOADFROMFILE (B_LOB,F_LOB,DBMS_LOB.GETLENGTH (F_LOB),1,1);
DBMS_LOB.FILECLOSE (F_LOB);
COMMIT;
END;

SQL> exec insert_file(1,'test.doc');

5. 设置索引参考项
SQL> begin
ctx_ddl.create_preference('cnlex','CHINESE_VGRAM_LEXER');
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');
end;
(如果数据库的字符集是UTF8,建议使用CHINESE_LEXER词法分析器)
--查看自定义的参考项
SQL>select * from ctx_user_preferences;

6. 创建索引
SQL>create index idx_mytest on mytest(btext)
indextype is ctxsys.context
parameters ('DATASTORE CTXSYS.DIRECT_DATASTORE
FILTER CTXSYS.INSO_FILTER
LEXER WANG.CNLEX
WORDLIST WANG.MYWORDLIST');
(可以使用ctxcat索引类型,但好像不支持BLOB型)

--查看
SQL>select * from dr$idx_mytest$I
SQL>select * from mytest where contains(btext,’任务’)>0

7. 删除索引
SQL>drop index idx_mytest force;

8. 同步和优化
--同步
SQL>begin
Ctx_ddl.sync_index(‘idx_mytest’,’2M’);
End;

--优化
SQL>begin
Ctx_dll.optimize_index(‘myidx’,’full’);
End;

最好定期执行作业进行同步
create or replace procedure sync
is
begin
execute immediate
'alter index idx_mytest rebuild online' ||
' parameters ( ''sync'' )' ;
execute immediate
'alter index idx_mytest rebuild online' ||
' parameters ( ''optimize full maxtime unlimited'' )' ;
end sync;
/

Set ServerOutput on
declare
v_job number;
begin
Dbms_Job.Submit
(
job => v_job,
what => 'sync;',
next_date => sysdate, /* default */
interval => 'sysdate + 1/720' /* = 1 day / ( 24 hrs * 30 min) = 2 mins */
);
Dbms_Job.Run ( v_job );
Dbms_Output.Put_Line ( 'Submitted as job # ' || to_char ( v_job ) );
end;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/756652/viewspace-242373/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/756652/viewspace-242373/

Oracle的全文检索技术(转)相关推荐

  1. ElasticSearch全文检索技术

    目录 数据检索问题 大规模数据如何检索? 传统数据库的应对解决方案? 非关系型数据库的解决方案? 完全把数据放入内存怎么样? 全文检索技术 什么是全文检索? 全文检索场景 实时搜索与传统搜索 Elas ...

  2. (转)全文检索技术学习(一)——Lucene的介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/72582979 本文我将为大家讲解全文检索技术--Lucene,现在这个技术用到的比较多,我觉得 ...

  3. oracle数据库硬恢复,ORACLE数据库恢复技术

    一.恢复的意义 当我们使用一个数据库时,总希望数据库的内容是可靠的.正确的,但由于计算机系统的故障(硬件故障.网络故障.进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据 ...

  4. lucene教程--全文检索技术详解

    一 什么是全文检索 1.1 全文检索概念 全文检索是一种将文件中所有文本与检索项匹配的检索方法.它可以根据需要获得全文中有关章.节.段.句.词等信息.计算机程序通过扫描文章中的每一个词,对每一个词建立 ...

  5. 全文检索技术介绍与使用方法

    全文检索技术ElasitcSearch介绍: http://www.javacodegeeks.com/2013/04/getting-started-with-elasticsearch.html ...

  6. Oracle Stream Replication技术

    Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用. Oracle 的消息队列是通过发布/订阅的方式来解决事件管理.流复制(Stream re ...

  7. oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)

    Oracle数据库并行处理技术是数据库的一项核心技术,它使组织能够高效地管理和访问TB级的数据.如果不能提供高效的Oracle数据库并行处理技术,这些大型数据库(通常用于数据仓库但也越来越多地出现在业 ...

  8. Oracle闪回技术

    Oracle闪回技术   我们都清楚的知道,当我们数据库中的数据删除或者更新之后,数据很难再还原回来,在没有了解闪回技术之前,就觉得是没办法还原了,这样子会付出很大的代价. 现在我来总结一下闪回技术的 ...

  9. SQL Server 2005全文检索技术在网站上的应用实录

    SQL Server 2005全文检索技术在网站上的应用实录 一.前言 "人类失去搜索,世界将会怎样?",同样,很难想象一个拥有极大信息量的行业网站门户没有站内全文搜索将会出现怎样 ...

最新文章

  1. 11.Map集合之实现类HashMapHashtableTreeMapLinkedHashMapProperties浅析
  2. PostgreSQL在何处处理 sql查询之十二
  3. (Mirage系列之十)Mirage经典案例之系统恢复
  4. 加州无人车报告出炉,苹果表现垫底,国产车进前五
  5. 简单易懂的多线程(通过实现Runnable接口实现多线程)
  6. linux unset path,linux查看和修改PATH环境变量的方法
  7. iOS判断是模拟器还是真机
  8. P5664-Emiya家今天的饭【dp】
  9. 演练 开心庄园 1002
  10. 杭电1556 Color the ball
  11. 微服务化之服务拆分与服务发现
  12. 388. 文件的最长绝对路径
  13. IS-IS邻接关系建立过程
  14. 摘自网络上总结出的一些开源的技术
  15. xp系统计算机无法用搜索功能,XP系统搜索功能无法使用的六种解决方法
  16. 北理乐学大学计算机实验报告,北理乐学实验六.doc
  17. Proximal Policy Optimization Algorithms
  18. 更安全的ftp服务器Pure-FTP搭建(4)
  19. 【技能】使用纯CSS+html写出方向箭头,简单大方,好看
  20. Cassandra 3.x官方文档_cassandra.yaml配置文件

热门文章

  1. Windows 下安装并配置Maven
  2. 基于多目标算法的冷热电联供型综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化
  3. df和du显示的磁盘空间使用情况不一致的原因及处理
  4. 为什么不推荐去做安全测试工程师?
  5. hadoop系列十八——案例 App数据统计与报表统计
  6. 解决Mac能接受qq消息但打不开网页的问题
  7. ei加声调怎么加_ei的四个声调怎么写
  8. 已经成功拿到了几个offer的我来告诉你,Android面试官问的一些问题,看完这一篇就没有拿不到的offer
  9. 流氓 2345.com的新动态及解决方法
  10. HTML5 APP从入门到精通