透明 发表于 2015-1-16 22:42:01

MYSQL网页编程之Oracle9i的全文检索手艺

列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序。MySQL学习教程这就如同我们经常争论的故事:先有鸡还是先有蛋?oracle|全文检索  择要全文检索手艺是智能信息办理的关头手艺之一,OracleText作为Oracle9i的一个组件,供应了壮大的全文检索功效,用Oracle9i做背景数据库,就能够充实使用其全文检索手艺,构建庞大的年夜型文档办理体系。本文次要先容了OracleText的系统布局及其利用。

  关头词OracleText全文检索

  Oracle一向努力于全文检索手艺的研讨,当Oracle9iRlease2公布之时,Oracle数据库的全文检索手艺已十分完善,OracleText使Oracle9i具有了壮大的文本检索才能和智能化的文本办理才能。OracleText是Oracle9i接纳的新称号,在Oracle8/8i中它被称作OracleinterMediaText,在Oracle8之前它的称号是OracleConTextCartridge。利用Oracle9i和OracleText,能够便利而无效天时用尺度的SQL工具来构建基于文本的新的开辟工具或对现有使用程序举行扩大。使用程序开辟职员能够在任何利用文本的Oracle数据库使用程序中充实使用OracleText搜刮,使用局限能够是现有使用程序中可搜刮的正文字段,也但是完成触及多种文档格局和庞大搜刮尺度的年夜型文档办理体系。OracleText撑持Oracle数据库所撑持的年夜多半言语的基础全文搜刮功效。本文将先容怎样利用Oracle9i的全文检索手艺来为本人的使用供应一个优异的办理计划。
 
  1OracleText的系统架构

  下图是OracleText的系统架构。


OracleText的系统架构

  以下面的系统架构图为基本,OracleText索引文档时所利用的次要逻辑步骤以下:

  (1)数据存储逻辑搜刮表的一切行,并读取列中的数据。一般,这只是列数据,但有些数据存储利用列数据作为文档数据的指针。比方,URL_DATASTORE将列数据作为URL利用。

  (2)过滤器提取文档数据并将其转换为文本暗示体例。存储二进制文档(如Word或Acrobat文件)时必要如许做。过滤器的输入不用是纯文本格局--它能够是XML或HTML之类的文本格局。

  (3)分段器提取过滤器的输入信息,并将其转换为纯文本。包含XML和HTML在内的分歧文本格局有分歧的分段器。转换为纯文本触及检测主要文档段标志、移往不成见的信息和文本从头格局化。

  (4)词法剖析器提取分段器中的纯文本,并将其拆分为不一连的标志。既存在空缺字符分开言语利用的词法剖析器,也存在分段庞大的亚洲言语利用的专门词法剖析器。

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

  2复杂的示例

  这里先给出一个复杂示例说使用OracleText完成全文检索的办法与步骤,在前面在举行详细的申明。Orcale9i供应了OracleTextManager能够简化很多事情,一切在OracleTextManager中完成的事情,都能够在经由过程PL/SQL来完成。要利用OracleText,必需具有CTXAPP脚色大概是CTXSYS用户。OracleText为体系办理员供应CTXSYS用户,为使用程序开辟职员供应CTXAPP脚色。

  CTXSYS用户可实行以下义务:启动OracleText服务器,实行CTXAPP脚色的一切义务。
具有CTXAPP脚色的用户可实行以下义务:创立索引,办理OracleText数据字典,包含创立和删除首选项,举行OracleText查询,利用OracleTextPL/SQL程序包。

  利用OracleText的步骤:

  (1)创立表来保留某些文档。该示例利用一个主关头字列来标识每一个文档,利用一个小的VARCHAR2列来保留每一个文档。

CREATETABLEdocs(idNUMBERPRIMARYKEY,textVACHAR2(80));

  (2)将两个示例文档置进该表:

INSERTINTOdocsVALUES(1,thefirstdoc);
INSERTINTOdocsVALUES(2,theseconddoc);
COMMIT;

  (3)利用OracleTextManager来创立和修正首选项,首选项将与索引相干联。

  (4)利用OracleTextManager创立文本索引。别的,能够输出以下利用默许首选项的SQL语句:

CREATEINDEXdoc_indexONdocs(text)INDEXTYPEISCTXSYS.CONTEXT;

  (5)利用CONTAINS函数,收回基于内容的文档查询。比方:

SELECTidFROMdocsWHERECONTAINS(text,first)>0;

  这将在文本列包括单词first(即文档1)的docs中查找一切行。语句中的>0部分是无效的OracleSQL所必须的,OracleSQL不撑持函数的布尔前往值。

  以上只是一个复杂的示例,旨在给出利用OracleText创建全文索引的完全步骤,归结起来以下:

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

  (2)设置索引

  (3)创建索引

  (4)收回查询

  (5)索引保护:同步与优化(将在前面先容)

  3文本装载

  要完成文本的全文检索起首必需把准确的文本加载到数据库表中,默许的创建索引举动请求将文档装载在文本列中,只管能够用别的体例(包含文件体系和URL情势)存储文档(在"数据存储"选项举行设置)。默许情形下,体系应当将文档装载在文本列中。文本列能够是VARCHAR2、CLOB、BLOB、CHAR或BFILE。注重,只要在将Oracle7体系移植到Oracle8的情形下才撑持用LONG和LONGRAW这两个相反的列范例存储文本。不克不及为列范例NCLOB、DATE和NUMBER创建索引。

  关于文档格局,由于体系能为包含HTML、PDF、MicrosoftWord和纯文本在内的年夜多半文档格局创建索引,能够将个中的任何文档范例装载到文本列中(在"过滤器"选项中设置)。有关所撑持的文档格局的具体信息,能够参阅OracleTextUsersGuideandReference中的附录"SupportedFilterFormats"。

  装载办法次要有以下几种:

  (1)SQLINSERT语句

  (2)ctxload可实行文件

  (3)SQL*Loader

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

  (5)OracleCallInterface

  4为文本创建索引

  文本装进文本列后,就能够创立OracleText索引。文档以很多分歧计划、格局和言语存储。因而,每一个OracleText索引有很多必要设置的选项,以针对特定情形设置索引。创立索引时,OracleText可以使用多少个默许值,但在年夜多半情形下请求用户经由过程指定首选项来设置索引。

  每一个索引的很多选项构成功效组,称为"类",每一个类会合表现设置的某一方面,能够以为这些类就是与文档数据库有关的一些成绩。比方:数据存储、过滤器、词法剖析器、相干词表、存储等。

  每一个类具有很多预界说的举动,称之为工具。每一个工具是类成绩大概具有的谜底,而且年夜多半工具都包括有属性。经由过程属性来定制工具,从而使对索引的设置加倍多变以顺应于分歧的使用。

  (1)存储(Storage)类

  存储类指定组成OracleText索引的数据库表和索引的表空间参数和创立参数。它唯一一个基础工具: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)文档段组(SectionGroup)类

  文档段组是用于指定一组文档段的工具。必需先界说文档段,然后才干利用索引经由过程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)索引集(IndexSet)

  索引集是一个或多个Oracle索引(不是OracleText索引)的汇合,用于创立CTXCAT范例的OracleText索引,只要一个基础工具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_FILTERINSO、NULL_FILTER、PROCEDURE_FILTER、USER_FILTER。

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

  非索引字表类是用以指定一组不编进索引的单词(称为非索引字)。有两个基础工具:BASIC_STOPLIST(一种言语中的一切非索引字)、MULTI_STOPLIST(包括多种言语中的非索引字的多言语非索引字表)。

  5查询

  创建了索引,就能够利用SELECT语句中的CONTAINS运算符收回文本查询。利用CONTAINS能够举行两种查询:单词查询和ABOUT查询。

  5.1词查询示例

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

SELECTSCORE(1)titlefromnewsWHERECONTAINS(text,oracle,1)>0;

  在查询表达式中,可使用AND和OR等文本运算符来猎取分歧了局。还能够将布局性谓词增加到WHERE子句中。可使用count(*)、CTX_QUERY.COUNT_HITS或CTX_QUERY.EXPLAIN来盘算查询的射中(婚配)数量。

  5.2ABOUT查询示例

  在一切言语中,ABOUT查询增添了某查询所前往的相干文档的数量。在英语中,ABOUT查询可使用索引的主题辞组件,该组件在默许情形下创立。如许,运算符将依据查询的观点前往文档,而不是仅根据所指定的准确单词或短语。比方,以下查询将查找文本列中关于主题politics的一切文档,而不是仅包括politics一词的文档:

SELECTSCORE(1)titlefromnewsWHERECONTAINS(text,about(politics),1)>0;

  6显现满意查询前提的文档

  一般,经由过程利用OracleText查询使用程序,用户可检察查询所前往的文档。用户从射中列表当选择一个文档,然后使用程序以某种情势显现该文档。经由过程OracleText,能够用分歧的体例再现文档。比方,能够经由过程凸起显现查询词来显现文档。凸起显现的查询词能够是相干词查询中的词,也能够是英文ABOUT查询中的主题辞。

  以下是关于输入效果和用于每一个输入效果的历程的信息:

  凸起显现的文档,纯文本格局版本(CTX_DOC.MARKUP)

  凸起显现的文档,HTML版本(CTX_DOC.MARKUP)

  凸起显现纯文本格局版本的偏移量信息(CTX_DOC.HIGHLIGHT)

  凸起显现HTML版本的偏移量信息(CTX_DOC.HIGHLIGHT)

  纯文本格局版本,无凸起显现(CTX_DOC.FILTER)

  HTML版本文档,无凸起显现(CTX_DOC.FILTER)

  7索引保护

  索引建好后,假如表中的数据产生变更,好比增添或修正了纪录,怎样办?因为对表所产生的任何DML语句,都不会主动修正索引,因而,必需准时同步(sync)和优化(optimize)索引,以准确反应数据的变更。
在索引建好后,能够在该用户下查到Oracle主动发生了以下几个表:(假定索引名为myindex):
DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N

  个中以I表最主要,能够查询一下该表:

selecttoken_text,token_countfromDR$myindex$Iwhererownum<=20;

  查询了局在此省略。能够看到,该表中保留的实在就是Oracle剖析你的文档后,天生的term纪录在这里,包含term呈现的地位、次数、hash值等。当文档的内容改动后,能够想见这个I表的内容也应当响应改动,才干包管Oracle在做全文检索时准确检索到内容(由于所谓全文检索,实在中心就是查询这个表)。那末怎样保护该表的内容,不克不及每次数据改动都从头创建索引,这就要用到sync和optimize了。

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

  优化(optimize):扫除I表的渣滓,次要是将已被删除的term从I表删除。

  Oracle供应了一个所谓的ctxserver来做这个同步和优化的事情,只必要在背景运转这个历程,它会监督数据的变更,实时举行同步。别的,也能够用以下的job来完成(该job要建在和表统一个用户下):

createorreplaceproceduresync
is
begin
executeimmediate
alterindexmyindexrebuildonline||
parameters(sync);
executeimmediate
alterindexmyindexrebuildonline||
parameters(optimizefullmaxtimeunlimited);
endsync;
/

SetServerOutputon
declare
v_jobnumber;
begin
Dbms_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;
/
  job的SYSDATE+(1/720)是指每隔2分钟同步一次。详细的工夫距离,能够依据本人的使用的必要而定。

  8小结

  文本关于各类范围的公司、机构构造来讲,都是包括浩瀚丰厚信息的最无效载体,OracleText的推出,标记着Oracle供应了一套极新的手艺,能够便利平安的用于办理企业的文本信息。OracleText使使用程序开辟者能够通明地将全文检索才能到场到基于SQL的使用程序中,OracleText也是其他Oracle产物的中心组件,好比Oracle9iASPortal,OracleeBusinessSuite,OracleUltraSearch和OracleInternetFileSystem等。天真使用OracleText供应的全文检索手艺,就能够使本人的使用具有壮大的全文检索才能。



MySQL的支持者们却认为,MySQL所保留的功能都是精华,并且是你部署、MySQL学习教程配置和维护这个数据库所必不可少的一些功能。

谁可相欹 发表于 2015-1-19 21:19:11

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

小女巫 发表于 2015-1-28 11:26:05

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

冷月葬花魂 发表于 2015-2-5 21:11:14

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

灵魂腐蚀 发表于 2015-2-13 15:55:18

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

只想知道 发表于 2015-3-3 23:49:46

原来公司用过MYSQL自己也只是建个表写个SQL

愤怒的大鸟 发表于 2015-3-11 14:46:26

对于微软系列的东西除了一遍遍尝试还真没有太好的办法

精灵巫婆 发表于 2015-3-19 00:18:50

sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西

admin 发表于 2015-3-26 21:58:16

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
页: [1]
查看完整版本: MYSQL网页编程之Oracle9i的全文检索手艺