Oracle全文索引前言:Oracle从7.3开始支持全文检索,即用户可以使用Oracle服务器的上下文(ConText)选项完成基于文本的查询。具体可以采用通配符查找、模糊匹配、相关分类、近似查找、条件加权和词意扩充等方法。在Oracle8.0.x中称为ConText;在Oracle8i中称为interMediaText;Oracle9i中称为OracleText。OracleText是9i标准版和企业版的一部分。Oracle9i将全文检索功能做为内置功能提供给用户,使得用户在创建数据库实例时自动安装全文检索。OracleText的应用领域有很多:搜索文本:需要快捷有效搜索文本数据的应用程序。管理多种文档:允许搜索各种混和文档格式的应用程序,包括ord,excel,lotus等。从多种数据源中检索文本:不仅来自Oracle数据库中的文本数据,而且可以来自Internet和文件系统的文本数据。搜索XML应用程序。1、搜索文本不使用Oracletext功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR函数和LIKE操作符实现.SELECT*FROMmytextWHEREINSTR(thetext,'Oracle')0;SELECT*FROMmytextWHEREthetextLIKE'%Oracle%';有很多时候,使用instr和like是很理想的,特别是搜索仅跨越很小的表的时候。然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限。利用OracleText,你可以回答如“在存在单词’Oracle’的行同时存在单词’Corporation’而且两单词间距不超过10个单词的文本,查询含有单词’Oracle’或者单词’california’的文本,并且将结果按准确度进行排序,含有词根train的文本”,以下的sql代码实现了如上功能,我们且不管这些语法是如何使用的:DROPINDEXindexmytext_idx;--丢弃索引mytext_idx/CREATEINDEXmytext_idxONmytext(thetext)INDEXTYPEisCTXSYS.CONTEXT;--创建CONTEXT类型索引mytext_idx/SELECTidFROMmytextWHEREcontains(thetext,'near((Oracle,Corporation),10)')0;--发出contains查询/SELECTscore(1),idFROMmytextWHEREcontains(thetext,'Oracleorcalifornia',1)0ORDERBYscore(1)DESC/SELECTidFROMmytextWHEREcontains(thetext,'$train')0;2、索引介绍利用OracleText对文档集合进行检索的时候,你必须先在你的文本列上建立索引。索引将文本打碎分成很多记号(token),这些记号通常是用空格分开的一个个单词。OracleText应用的实现实际上就是一个数据装载—索引数据—执行检索的一个过程。建立的OracleText索引被称为域索引(domainindex),包括4种索引类型:CONTEXT、CTXCAT、CTXRULE、CTXXPATH依据你的应用程序和文本数据类型你可以任意选择一种。可以利用CreateIndex建立这4种索引。下面说一下这4种索引的使用环境:CONTEXT:用于对含有大量连续文本数据进行检索。支持word、html、xml、text等很多数据格式。支持中文字符集,支持分区索引,唯一支持并行创建索引(Parallelindexing)的索引类型。对表进行DML操作后,并不会自动同步索引。需要手工同步索引。查询操作符:CONTAINS。CTXCAT:当使用混合查询语句的时候可以带来很好的效率。适合于查询较小的具有一定结构的文本段。具有事务性,当更新主表的时候自动同步索引。TheCTXCATindexdoesnotsupporttableandindexpartitioning,documentsservices(highlighting,markup,themes,andgists)orqueryservices(explain,queryfeedback,andbrowsewords.)。查询操作符:CATSEARCHCTXRULE:Usetobuildadocumentclassificationapplication.Youcreatethisindexonatableofqueries,whereeachqueryhasaclassification.Singledocuments(plaintext,HTML,orXML)canbeclassifiedbyusingtheMATCHESoperator。查询操作符:MATCHES。CTXXPATH:CreatethisindexwhenyouneedtospeedupExistsNode()queriesonanXMLTypecolumn。CanonlycreatethisindexonXMLTypecolumn.。查询操作符:无。在以上4种索引中,最常用的就是CONTEXT索引,使用CONTAINS操作符进行查询。OracleText索引将文本打碎分成很多的记号(token),例如文本‘ILove’将会被分成:I,LOVE,,ITPUB,NET这样的记号(token)。OracleTextCONTEXT索引是反向索引(invertedindex)。每个记号(token)都映射着包含它自己的文本位置。在索引建立过程中,单词Cat会包括如下的条目入口:Catrow1,row2,row3表示Cat在行row1、row2、row3都出现过,这样通过查找单词所对应的行的rowid就可以迅速找到文本记录。在索引建好后,我们可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex):DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,默认情况下全文索引是不区分大小写。赋权限:grantresource,dba,connect,ctxapptousername;grantexecuteonctxsys.ctx_ddltousername;--用于创建同步和优化索引的存储过程。说明:ctxapp用于用户建立OracleText索引。3、CONTEXT索引语法:CREATEINDEX[schema.]indexon[schema.]table(column)INDEXTYPEISctxsys.context[ONLINE]LOCAL[(PARTITION[partition][PARAMETERS('paramstring')][,PARTITION[partition][PARAMETERS('paramstring')]])][PARAMETERS(paramstring)][PARALLELn][UNUSABLE];数据库用创建和插入这些索引的方法叫做索引管道(indexPipeline)。根据不同的参数构建索引,可以应用于很多实际环境。类别描述Datastore从哪里得到数据?Filter将数据转换成文本Lexer正在索引什么语言?Wordlist应该如何展开茎干和模糊查询类别描述Storage如何存储索引StopList什么单词或者主题不被索引?SectionGroup允许在区段内查询吗?如何定义文档区段。这把文档转换成普通文本这些参数在建立CONTEXT索引过程中将按下图顺序对索引进程起作用。在本篇中提供一些简单demo会看到各个参数的作用。建立索引时,系统默认文档存储在数据库的文本列中。如果不显示的指定索引参数,系统会自动探测文本语言,数据类型和文档格式。CREATEINDEXmyindexONdocs(text)INDEXTYPEISCTXSYS.CONTEXT;如上命令在表docs的text列上建立了一个默认参数的CONTEXT类型索引myindex,系统默认:文本存储在数据库中。可以是CLOB,BLOB,BFILE,VARCHAR2,orCHAR类型的文本数据。文本列语言是数据库建立时的默认的字符集。使用数据库默认的终止目录stoplist.stoplist记录存在于文本列中但不对其索引的词。允许模糊查询。索引参数OracleText索引文档时所使用的主要参数如下:1)数据存储逻辑(DATASTORE)搜索表的所有行,并读取列中的数据。通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。例如,URL_DATASTORE将列数据作为URL使用。2)过滤器(FILTER)提取文档数据并将其转换为文本表示方式。存储二进制文档(如Word或Acrobat文件)时需要这样做。过滤器的输出不必是纯文本格式--它可以是XML或HTML之类的文本格式。3)分段器(SECTIONER)提取过滤器的输出信息,并将其转换为纯文本。包括XML和HTML在内的不同文本格式有不同的分段器。转换为纯文本涉及检测重要文档段标记、移去不可见的信息和文本重新格式化。4)词法分析器(Lexer)提取分段器中的纯文本,并将其拆分为不连续的标记。既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。5)索引引擎(IndexingEngine)提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。倒排索引存储标记和含有这些标记的文档。DataStore:指明你的文本是如何存储的。系统默认文档储存在数据库内的文本列(CHAR,VARCHAR,VARCHAR2,BLOB,CLOB,BFILE,orXMLType)中。DataStore对象在由过滤器处理之前从数据库中的列摘录文本。你要索引的文档可以来自多种数据源。DatastoreTypeUseWhenDatastoreTypeUseWhenDIRECT_DATASTOREDataisstoredinternallyinthetextcolumn.Eachrowisindexedasasingledocument.MULTI_COLUMN_DATASTOREDataisstoredinatexttableinmorethanonecolumn.Columnsareconcatenatedtocreateavirtualdocument,oneperrow.DETAIL_DATASTOREDataisstoredinternallyinthetextcolumn.Documentconsistsofoneormorerowsstoredinatextcolumninadetailtable,withheaderinformationstoredinamastertable.FILE_DATASTOREDataisstoredexternallyinoperatingsystemfiles.Filenamesarestoredinthetextcolumn,oneperrow.NESTED_DATASTOREDataisstoredinanestedtable.URL_DATASTOREDataisstoredexternallyinfileslocatedonanintranetortheInternet.UniformResourceLocators(URLs)arestoredinthetextcolumn.USER_DATASTOREDocumentsaresynthesizedatindextimebyauser-definedstoredprocedure.说明