Oracle的全文检索技术.docx

上传人:李医生 文档编号:10680467 上传时间:2021-05-30 格式:DOCX 页数:11 大小:43.48KB
返回 下载 相关 举报
Oracle的全文检索技术.docx_第1页
第1页 / 共11页
Oracle的全文检索技术.docx_第2页
第2页 / 共11页
Oracle的全文检索技术.docx_第3页
第3页 / 共11页
Oracle的全文检索技术.docx_第4页
第4页 / 共11页
Oracle的全文检索技术.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《Oracle的全文检索技术.docx》由会员分享,可在线阅读,更多相关《Oracle的全文检索技术.docx(11页珍藏版)》请在三一文库上搜索。

1、Oracle的全文检索技术Oracle 一直致力于全文检索技术的研究,当 Oracle9iRlease2发布之时,Oracle数据库的全文检索技术已经非常完美,OracleText使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力。OracleText是Oracle9i采用的新名称,在 Oracle8/8i中它被称作OracleinterMediaText 。使用OracleText ,可以方便而有效地利用标准的SQL工具来构建基于文本的新的开发工具或对现有应用程序进行扩展。应用程序开发人员可以在任何使用文本的Oracle数据库应用程序中充分利用 OracleText搜索,应用范

2、围可以是现有应用程序 中可搜索的注释字段,也可是实现涉及多种文档格式和复杂搜索标准的大型文档管理系统。OracleText支持Oracle数据库所支持的大多数语言的基本全文搜索功能。虽然大多数大型数据库都支持全文检索,但Oracle在这方面无疑是最出色的。Oracle能搜索多种格式的文档,如Word,Execl,PowerPoint,Html,PDF 等等。但在使用中也发现有遗憾的地方,OracleText无论使用何种过滤器(INSO_FILTER或NULL_FILTER )及何种 词法分析器(BASIC_LEXER,CHINESE_VGRAM_LEXER 还是 CHINESE_LEXER )

3、者B不能检 索出中文内容的文本文档(TXT,RTF)。1OracleText的体系架构下图是OracleText的体系架构:图1OracleText 的体系架构OracleText 索引文档时所使用的主要逻辑步骤如下:( 1 )数据存储逻辑搜索表的所有行,并读取列中的数据。通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。 例如, URL_DATASTORE 将列数据作为 URL 使用。如果对本地文件进行检索, 只要指定 DATASTORE 中 FILE_DATASTORE 参数为文件的路径即可。( 2 )过滤器提取文档数据并将其转换为文本表示方式。存储二进制文档(如 Word

4、或Acrobat 文件 )时需要这样做。过滤器的输出不必是纯文本格式- 它可以是 XML 或 HTML 之类的文本格式。( 3 )分段器提取过滤器的输出信息,并将其转换为纯文本。包括 XML 和 HTML 在内的不同文本格式有不同的分段器。 转换为纯文本涉及检测重要文档段标记、 移去不可见的信息和 文本重新格式化。( 4 )词法分析器提取分段器中的纯文本,并将其拆分为不连续的标记。既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。( 5 )索引引擎提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。倒排索

5、引存储标记和含有这些标记的文档。归纳起来如下:( 1 )建表并装载文本(包含带有需要检索的文本字段)( 2 )配置索引( 3 )建立索引( 4 )发出查询( 5 )索引维护:同步与优化(将在后面介绍)文本装载要实现文本的全文检索首先必须把正确的文本加载到数据库表中,默认的建立索引行为要求将文档装载在文本列中,尽管可以用其它方式(包括文件系统和URL 形式 )存储文档(在数据存储 选项进行设置 )。默认情况下,系统应该将文档装载在文本列中。文本列可以是VARCHAR2 、 CLOB 、 BLOB 、 CHAR 或 BFILE 。 注意, 只有在将 Oracle7系统移植到 Oracle8 的情况

6、下才支持用 LONG 和 LONGRAW 这两个相反的列类型存储文本。不能为列类型NCLOB 、 DATE 和 NUMBER 建立索引。关于文档格式,因为系统能为包括HTML 、 PDF 、 MicrosoftWord 和纯文本在内的大多数文档格式建立索引,可以将其中的任何文档类型装载到文本列中(在过滤器选 项中设 置)。 有关所支持 的文档格 式的详细信息, 可以参 阅OracleTextUsersGuideandReference 中的附录 SupportedFilterFormats 。装载方法主要有以下几种:( 1 ) SQLINSERT 语句( 2 ) ctxload 可执行文件(

7、3 ) SQL*Loader( 4 )从 BFILE 中装载 LOB 的 DBMS_LOB.LOADFROMFILE()PL/SQL 过程( 5 ) OracleCallInterface建立索引文本装入文本列后, 就可以创建OracleText 索引。 文档以许多不同方案、 格式和语言存储。因此,每个OracleText 索引有许多需要设置的选项,以针对特定情况配置索引。创建索引时, OracleText 可使用若干个默认值,但在大多数情况下要求用户通过指定首选项来配置索引。每个索引的许多选项组成功能组,称为类 ,每个类集中体现配置的某一方面,可以认为这些类就是与文档数据库有关的一些问题。例

8、如:数据存储、过滤器、词法分析器、相关词表、存储等。每个类具有许多预定义的行为,称之为对象。每个对象是类问题可能具有的答案,并且大多数对象都包含有属性。通过属性来定制对象,从而使对索引的配置更加多变以适应于不同的应用。( 1 )存储( Storage )类存储类指定构成OracleText 索引的数据库表和索引的表空间参数和创建参数。 它仅有一个基本对象: BASIC_STORAGE , 其属性包括: I_Index_Clause 、 I_Table_Clause 、K_Table_Clause 、 N_Table_Clause 、 P_Table_Clause 、 R_Table_Claus

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

10、段的对象。必须先定义文档段,然后才能使用索引通过 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 , 其属性有:

11、 Fuzzy_Match 、 Fuzzy_Numresults 、 Fuzzy_Score 、Stemmer 、 Substring_Index 、 Wildcard_Maxterms 、 Prefix_Index 、 Prefix_Max_Length 、 Prefix_Min_Length 。( 5 )索引集( IndexSet )索引集是一个或多个Oracle 索引 (不是OracleText 索引 ) 的集合,用于创建 CTXCAT类型的 OracleText 索引,只有一个基本对象BASIC_INDEX_SET 。( 6 )词法分析器( Lexer )类词法分析器类标识文本使用的语言

12、,还确定在文本中如何标识标记。默认的词法分析器是英语或其他西欧语言,用空格、标准标点和非字母数字字符标识标记,同时禁用 大 小 写 。 包 含 8 个 基 本 对 象 : BASIC_LEXER 、 CHINESE_LEXER 、 CHINESE_VGRAM_LEXER 、 JAPANESE_LEXER 、 JAPANESE_VGRAM_LEXER 、 KOREAN_LEXER 、 KOREAN_MORPH_LEXER 、 MULTI_LEXER 。( 7 )过滤器( Filter )类过滤器确定如何过滤文本以建立索引。可以使用过滤器对文字处理器处理的文档、格式化的文档、 纯文本和 HTML

13、文档建立索引, 包括 5个基本对象: CHARSET_FILTER 、INSO_FILTERINSO 、 NULL_FILTER 、 PROCEDURE_FILTER 、 USER_FILTER 。( 8 )非索引字表( Stoplist )类非索引字表类是用以指定一组不编入索引的单词 ( 称为非索引字) 。有两个基本对象:BASIC_STOPLIST( 一种语言中的所有非索引字) 、 MULTI_STOPLIST( 包含多种语言中的非索引字的多语言非索引字表) 。查询建立了索引,就可以使用 SELECT 语句中的CONTAINS 运算符发出文本查询。使ABOUT 查询。用 CONTAINS

14、可以进行两种查询:单词查询和5 1 词查询示例词查询是对输入到 CONTAINS 运算符中单引号间的精确单词或短语的查询。在以下示例中, 我们将查找文本列中包含 oracle 一词的所有文档。 每行的分值由使用标签1 的 SCORE 运算符选定:SELECTSCORE(1)titlefromnewsWHERECONTAINS(text,oracle,1)0;在查询表达式中,可以使用 AND 和 OR 等文本运算符来获取不同结果。还可以将结构性谓词添加到 WHERE 子句中。 可以使用 count(*) 、 CTX_QUERY.COUNT_HITS或 CTX_QUERY.EXPLAIN 来计算查

15、询的命中(匹配 )数目。5 2ABOUT 查询示例在所有语言中, ABOUT 查询增加了某查询所返回的相关文档的数目。在英语中,ABOUT 查询可以使用索引的主题词组件,该组件在默认情况下创建。这样,运算符将根据查询的概念返回文档,而不是仅依据所指定的精确单词或短语。例如,以下查询将查找文本列中关于主题 politics 的所有文档, 而不是仅包含 politics 一词的文档:SELECTSCORE(1)titlefromnewsWHERECONTAINS(text,about(politics),1)0;索引维护索引建好后,如果表中的数据发生变化,比如增加或修改了记录,怎么办?由于对表所发

16、生的任何 DML 语句,都不会自动修改索引,因此,必须定时同步 (sync) 和优化 (optimize) 索引,以正确反映数据的变化。在索引建好后,可以在该用户下查到Oracle 自动产生了以下几个表: (假设索引名为myindex ) :DR$myindex$I , DR$myindex$K , DR$myindex$R , DR$myindex$N其中以 I 表最重要,可以查询一下该表:selecttoken_text,token_countfromDR$myindex$Iwhererownumcreateuserminiidentifiedbymini;SQLalterusermini

17、defaulttablespaceEXAMPLE;SQLgrantconnect,resourcetomini;SQLgrantctxapptomini;SQLalteruserminidefaultroleall;3. 创建表:用 mini 用户登录。SQLcreatetablemytest(tidnumberprimarykey,fnamevarchar2(100),btextBLOB)4. 录入数据:用 system 用户登录- 创建目录( 数据库服务器)SQLcreateorreplacedirectoryBLOB_FILE_DIRasd:test;SQLgrantreadondire

18、ctoryBLOB_FILE_DIRtomini;用 mini 用户登录- 创建过程CREATEORREPLACEPROCEDUREinsert_file(TIDnumber,FILENAMEVARCHAR2)ISF_LOBBFILE;B_LOBBLOB;BEGININSERTINTOMYTEST(tid,fname,btext)VALUES(TID,FILENAME,EMPTY_BLOB()RETURNbtextINTOB_LOB;F_LOB:=BFILENAME(BLOB_FILE_DIR,FILENAME);DBMS_LOB.FILEOPEN(F_LOB,DBMS_LOB.FILE_RE

19、ADONLY);DBMS_LOB.LOADFROMFILE(B_LOB,F_LOB,DBMS_LOB.GETLENGTH(F_LOB),1,1);DBMS_LOB.FILECLOSE(F_LOB);COMMIT;END;SQLexecinsert_file(1,test.doc);5. 设置索引参考项SQLbeginctx_ddl.create_preference(cnlex, CHINESE_VGRAM_LEXER );ctx_ddl.create_preference(mywordlist,BASIC_WORDLIST);ctx_ddl.set_attribute(mywordlist,

20、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. 创建索引SQLcreateindexi

21、dx_mytestonmytest(btext)indextypeisctxsys.contextparameters(DATASTORECTXSYS.DIRECT_DATASTOREFILTERCTXSYS.INSO_FILTERLEXERMINI.CNLEXWORDLISTMINI.MYWORDLIST);(可以使用 ctxcat 索引类型,但好像不支持 BLOB 型)- 查看SQLselect*fromdr$idx_mytest$I;SQLselect*frommytestwherecontains(btext, 中文 )07. 删除索引SQLdropindexidx_mytestfor

22、ce;8. 同步和优化- 同步SQLbeginCtx_ddl.sync_index( idx_mytest , 2M );End;- 优化SQLbegin);Ctx_ddl.optimize_index( idx_mytest , fullEnd;最好定期执行作业进行同步createorreplaceproceduresyncisbeginexecuteimmediatealterindexidx_mytestrebuildonline|parameters(sync);executeimmediatealterindexidx_mytestrebuildonline|parameters(optimizefullmaxtimeunlimited);endsync;/SetServerOutputondeclarev_jobnumber;beginDbms_Job.Submit(job=v_job,what=sync;,next_date=sysdate,/*default*/interval=sysdate+1/720/*=1day/(24hrs*30min)=2mins*/ );Dbms_Job.Run(v_job);Dbms_Output.Put_Line(Submittedasjob#|to_char(v_job);end;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1