【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
- 关于字符串搜索
有很多时候,使用instr和like实现字符串搜索是很方便快捷,特别是搜索仅跨越很小的表的时候如下所示:
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0;
SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';
然而对于大表,通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限。
Oracle Text,即oracle 全文索引,则可以解决上述方法在效率上及及功能上的局限性。(对于性能的对比可以参阅http://viralpatel.net/blogs/oracle-index-usage-like-operator-domain-indexes/)
- oracle全文检索
全文检索(full-text search),是一种将文件中所有文本与检索项匹配的文字资料检索方法。在oracle 中,用户可以使用oracle 服务器的上下文(context)选项完成基于文本的查询,相应的方法有通配符查找、模糊匹配、相关分类、近似查找、条件加权和词意扩充等。在Oracle8.0.x中 称为ConText ,在Oracle8i中 称为interMedia Text,在Oracle9i中称为Oracle Text。基于oracle text用户可以创建自己的搜索程序,如:
- 文本搜索:是现有应用程序中可搜索的文本数据
- 文档管理:多种文档格式和复杂搜索标准的大型文档管理系统,包括word,text,excel,etc
- 从多种数据源中检索文本:不仅来Oracle数据库中的文本数据,而且可以来自Internet和文件系统的文本数据。
- 搜索HTML/XML应用程序。
Oracle Text支持Oracle数据库所支持的大多数语言的基本全文搜索功能.
关于oracle text 各版本的描述参考:
http://www.oracle.com/technetwork/database/enterprise-edition/default-1590763.html
- Oracle 全文索引分类
Oracle Text应用的实现实际上就是一个 数据装载—> 索引数据—>执行检索 的一个过程。在使用Oracle Text检索功能前,必须先在文本列上建立索引,这个索引称之为域索引(domain index),域索引主要包括4种类型: CONTEXT、CTXCAT、CTXRULE 、CTXXPATH,开发者可根据应用程序和文本数据类型选择相应的索引,下面是这几种索引的区别。
索引类型 |
查询操作符 |
描述 |
功能支持 |
CONTEXT |
CONTAINS |
用于对含有大量连续文本数据进行检索。支持word、html、xml、text等很多数据格式,自定义灵活,对表进行DML操作后,并不会自动同步索引。需要手工使用CTX_DDL.SYNC_INDEX同步索引
|
支持中文字符集,支持分区索引,唯一支持并行创建索引(Parallel indexing)的索引类型,支持文档服务,查询服务,create index时支持filter by 与order by 子句 |
CTXCAT |
CATSEARCH |
对混合查询效率很好,适用于查询较小的具有一定结构的文本段。具有事务性,当主表有DML更新的时候可以自动同步索引,比context索引 要大,且创建时间也长 |
Format, charset, and language columns not supported. Table and index partitioning not supported. documents services (highlighting, markup, themes, and gists) or query services (explain, query feedback, and browse words.) |
CTXRULE |
MATCHES |
Use CTXRULE index to build a document classification or routing application. This index is created on a table of queries, where the queries define the classification or routing criteria |
Single documents (plain text, HTML, or XML) can be classified using the MATCHES operator, which turns a document into a set of queries and finds the matching rows in theCTXRULE index. |
CTXXPATH |
Use with existsNode() |
Create this index when you need to speed up existsNode()queries on an XMLType column. |
已废弃,仅支持老版本的XMLIndex |
|
|
|
|
更多信息参考:http://docs.oracle.com/cd/E11882_01/text.112/e24435/ind.htm#CCAPP9024
根据这4种索引的应用场景,用户可以使用create Index建立相应的索引,但这四类索引中context 索引最为常用。
- Oracle Text CONTEXT Index 结构
domain索引实际上将文本拆分成很多记号(tokens), 这些记号 通常是用空格分开的一个个单词。一般情况下oracle text context index 是反转索引,每个记号 (token)都映射着包含它自己的文本位置。
例如:在索引初始化过程中,单词dog可能会包括以下条目入口:
Word |
Appears in Document |
DOG |
DOC1 DOC3 DOC5 |
这也就意味着,dog包含在文档 doc1,doc3,doc5中,这样通过查找单词所对应的行的rowid就可以迅速找到文本记录。又如:
insert into docs values (1, 'first document');
insert into docs values (2, 'second document');
将创建以下反向索引
DOCUMENT ---> doc 1 position 2, doc 2 position 2
FIRST ---> doc 1 position 1
SECOND ---> doc 2 position 1
每个文档会被分配一个标识,称之为docid,反向索引就是使用这些id,快速定位。在索引创建好后,通常会生成一系列的辅助表,生成规则是 dr$+索引名+$+表用途标识,由于这些表是oracle 自动生成的,通常没有办法为这些表指定存储空间。为构造text 索引所 生成的辅助表指定表空间、存储参数(use the storage preference to specify tablespace and creation parameters for tables associated with a text index ),oracle 提供了单一的存储类型 basic_storage 。 例如:在 mytable1 表中建立了全文索检索 myindex ,系统中会自动产生如下 5个表:
DR$MYINDEX$I,
DR$MYINDEX$K,
DR$MYINDEX$R,
DR$MYINDEX$X
(详细说明见BASIC_STORAGE 参数)其中以I表最重要,默认情况下全文索引是不区分大小写。此外还要对用户给予相应的权限:
grant resource,dba,connect,ctxapp to username;
grant execute on ctxsys.ctx_ddl to username;--用于创建同步和优化索引的存储过程。
说明:ctxapp用于用户建立Oracle Text索引。
- 全文索引创建过程
Oracle Text 索引文档时所使用的主要步骤如下图所示
上图中相应步骤描述如下:
类别 |
描述 |
Datastore |
从哪里得到数据? 指明你的文本是如何存储的。系统默认文档储存在数据库内的文本列(CHAR, VARCHAR, VARCHAR2, BLOB, CLOB, BFILE, or XMLType)中。DataStore对象在由过滤器处理之前从数据库中的列摘录文本。你要索引的文档可以来自多种数据源。 |
Filter |
将数据转换成文本, |
Lexer |
正在索引什么语言? |
Wordlist |
应该如何展开茎干和模糊查询 |
Storage |
如何存储索引 |
Stop List |
什么单词或者主题不被索引? |
Section Group |
允许在区段内查询吗?如何定义文档区段。这把文档转换成普通文本 |
- 数据存储(DATASTORE)逻辑搜索表的所有行,并读取列中的数据。通常,这只是列数据,但有些数据存储使用列数据作为文档数据的指针。例如,URL_DATASTORE 将列数据作为 URL 使用。
- 过滤器(FILTER)提取文档数据并将其转换为文本表示方式。存储二进制文档 (如 Word 或 Acrobat 文件) 时需要这样做。过滤器的输出不必是纯文本格式 -- 它可以是 XML 或 HTML 之类的文本格式。
- 分段器(SECTIONER)提取过滤器的输出信息,并将其转换为纯文本。包括 XML 和 HTML 在内的不同文本格式有不同的分段器。转换为纯文本涉及检测重要文档段标记、移去不可见的信息和文本重新格式化。
- 词法分析器(Lexer)提取分段器中的纯文本,并将其拆分为不连续的标记。既存在空白字符分隔语言使用的词法分析器,也存在分段复杂的亚洲语言使用的专门词法分析器。
- 索引引擎(Indexing Engine)提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。倒排索引存储标记和含有这些标记的文档。
创建语法:
CREATE INDEX [schema.]index ON [schema.]table(txt_column)
INDEXTYPE IS ctxsys.context [ONLINE]
[FILTER BY filter_column[, filter_column]...]
[ORDER BY oby_column[desc|asc][, oby_column[desc|asc]]...]
[LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]
[, PARTITION [partition] [PARAMETERS('paramstring')]])]
[PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE]];
数据库用创建和插入这些索引的方法叫做索引管道(index Pipeline)。根据不同的参数构建索引,可以应用于很多实际环境。(关于 index pipeline 参考:http://www.oracle.com/technetwork/database/enterprise-edition/default-1590763.html
)
主要参数
对于以上语法context还可以换成ctxcat、ctxrule、ctxpath几个类型,支持分区索引.这里很重要的部分是PARAMETERS部分,定义了索引的各种创建各种参数.
The syntax for paramstring is as follows:
paramstring =
[DATASTORE datastore_pref] 定义要所索引的数据来自哪里,
[FILTER filter_pref] 定义过滤器,
[CHARSET COLUMN charset_column_name] 当选用CHARSET_FILTER过滤器时,显示指定
一个过滤器需要的列
[FORMAT COLUMN format_column_name] 过滤器需要格式化的列
[LEXER lexer_pref] 定义一个此法分析器
[LANGUAGE COLUMN language_column_name] 多语言环境中,显示指定lexer分析的多语言列
[WORDLIST wordlist_pref] 定义一个常用搜索词表
[STORAGE storage_pref] 定义索引的存储参数
[STOPLIST stoplist] 定义不需要index的词组列表
[SECTION GROUP section_group] 定义一个索引区域(通常用在索引html、xml的环境)
[MEMORY memsize] 分配索引创建需要的内存空间(in 10G)
[POPULATE | NOPOPULATE] 是否创建一个空的索引
[[METADATA] SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)] 定义索引同步时间(in 10G)
[TRANSACTIONAL]' 是否开启事务更新(in 10G)
DataStore:指明你的文本是如何存储的。系统默认文档储存在数据库内的文本列(CHAR, VARCHAR, VARCHAR2, BLOB, CLOB, BFILE, or XMLType)中。DataStore对象在由过滤器处理之前从数据库中的列摘录文本。你要索引的文档可以来自多种数据源。存储类型见(http://docs.oracle.com/database/122/CCREF/oracle-text-indexing-elements.htm#CCREF0203
或 http://docs.oracle.com/database/122/CCAPP/indexing-with-oracle-text.htm#CCAPP9050
Filter 过滤:一旦汇编了文档,它就沿管道传递。接下来这个阶段是过滤(Filter).如果文档是一种外来格式,就将它转换为可读取的文本,以便进行索引。默认是NULL_FILTER,它简单的直接传递文档,不作任何修改。
Section Groups区分组:区分组(Section Groups)是与interMedia一起使用XML的关键。这些组处理XML(或者HTML)文档,输出两个数据流,即区段界限和文本内容。默认是NULL_SECTION_GROUP,它简单的直接传递文本,不执行任何修改和处理。HTML_SECTION_GROUP是专门用来处理HTML文档的。
Storage 类:Storage(存储空间)组的类只含有BASIC_STORAGE.默认情况下,BASIC_STORAGE对象的属性是空的。我们通常需要定制自己的STORAGE类,来控制索引的存储参数以及存储空间。建立全文索引的时候我们通常会考虑表段dr$indexname$I,dr$indexname$K,dr$indexname$R,索引段dr$indexname$X的空间分配
类型 |
描述 |
BASIC_STORAGE |
为CONTEXT索引指定默认的存储参数 |
BASIC_STORAGE 有如下参数
属性 |
属性值 |
i_table_clause |
Parameter clause for dr$indexname$I table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement. The I table is the index data table. |
k_table_clause |
Parameter clause for dr$indexname$K table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement. The K table is the keymap table. |
r_table_clause |
Parameter clause for dr$indexname$R table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement. The R table is the rowid table. The default clause is: 'LOB(DATA) STORE AS (CACHE)' |
n_table_clause |
Parameter clause for dr$indexname$N table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement. The N table is the negative list table. |
i_index_clause |
Parameter clause for dr$indexname$X index creation. Specify storage and tablespace clauses to add to the end of the internal CREATE INDEX statement. The default clause is: 'COMPRESS 2' which instructs Oracle to compress this index table. If you choose to override the default, Oracle recommends including COMPRESS 2 in your parameter clause to compress this table, since such compression saves disk space and helps query performance. |
p_table_clause |
Parameter clause for the substring index if you have enabled SUBSTRING_INDEX in the BASIC_WORDLIST. Specify storage and tablespace clauses to add to the end of the internal CREATE INDEX statement. The P table is an index-organized table so the storage clause you specify must be appropriate to this type of table. |
默认情况下,4个表段和1个索引段将会建立在拥有该表的用户的默认表空间下。如下:
CREATE INDEX iowner.idx ON towner.tab(b) INDEXTYPE IS ctxsys.CONTEXT;
索引将会建立在IOWNER用户的默认表空间下,而不管发出该语句的用户是否是IOWNER;
设置词法分析器(lexer) :Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term)找出来,记录在一组 以dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle 针对不同的语言提供了不同的 lexer, 而我们通常能用到其中的三个:
l basic_lexer: 针对英语。它能根据空格和标点来 将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句 话作为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。
l chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字 字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。该分析器按字为单元来分析汉 语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。
l chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此 能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大 提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer.
如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器。要指定使用哪一个lexer, 可以这样操作:
1) 设置词法分析器:
BEGIN
ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
END;
/
2) 建立索引时指定词法分析器:
CREATE INDEX myindex ON mytable(mycolumn) indextype is ctxsys.context
parameters('lexer my_lexer');
这样建立的全文检索索引,就会 使用chinese_vgram_lexer作为分析器。 相应的,索引中文就比索引英文占用的表空间多 了许多。Oracle Text为了性能不得不牺 牲了空间
STOP Lists类:Stop List只不过是被索引忽略的单词的列表。这些通常是常见的单词,正常情况下不会以任何方式查询它们,因此,索引它们纯粹是表格空间和处理器周期的浪费。在具体的应用中,可能存在这样的单词,它们在特定的文集中出现的频率太大,无法提供有意义的内容,特别是 常用的单词。Stop List可以含有最多4095个单词,每个单词最多64个字符,同时为英语和其它语言提供了默认列表。
下图是Chinese Stoplist (Simplified)的默认列表:
可以查看英文的默认列表:
SELECT spw_word FROM DR$STOPWORD;
可以查询ctx_stoplists和ctx_stopwords 视图来观察这些语言。
EXECUTE ctx_ddl.create_stoplist('stoppref');
SELECT * FROM ctx_stoplists;
EXECUTE ctx_ddl.add_stopword('stoppref','的');
SELECT * FROM ctx_stoplists;
SELECT spw_word FROM dr$stopword;
Lists类:要考虑的最后一个类是单一的Word List类,即BASIC_WORDLIST。创建索引时不使用这个类,这个类只在某些高级形式的查询中使用。茎干查询使用从Xerox公司许可的技术,来匹配单词与通用的语言根。
其它选项:MEMORY参数以 通常的方式附着到CREATE INDEX中的PARAMETERS上,设置用于构建或更改索引的内存量。这个量不能超过MAX_INDEX_MEMEORY,使用CTX_ADM.SET_PARAMETER 对其进行设置。
查看系统默认参数项:
SELECT par_name, par_value FROM ctx_parameters;
设置系统默认参数:
CTX_ADM.SET_PARAMETER(param_name IN VARCHAR2,
param_value IN VARCHAR2);
Oracle Text使用的索引机制比通常的ORACLE B-TREE索引更复杂,且文档实际是在内存中构建的,而不是一次一行的添加到B-TREE。到达内存参数指定的值时,更新磁盘山的索引,接着,缓冲区由下一组文档重用。任一时刻缓冲区内的 文档数会有所不同,并且在索引处理之前不进行任何排序。因此,在少量的内存中索引大量文档会导致出现碎片索引情况。
注:
Once the index is created, any export will include the index definition. At import time, imp will re-create the index by issuing the create index statement.
- CONTEXT Index DML 管理
对于CTXSYS.CONTEXT索引,当应用程序对基表进行DML操作后,对基表的索引维护是必须的。索引维护包括索引同步和索引优 化。在索引建好后,我们可以在该用户下查到Oracle自动产 生了以下几个表:(假设索引名为myindex):DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,可以查询一下该表,看看有什么内容:
SELECT token_text, token_count FROM dr$i_rsk1$I WHERE ROWNUM <= 20;
这里就不列出查询结果了,可以看到,该表中保存的其实就是Oracle 分析你的文档后, 生成的term记录在这里,包括term出现的位置、次数、hash值等。当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表)。那么如何维护该表的内容呢?总不能每次数据改变都重新建立索引吧!这就用到sync 和 optimize了。
同步(sync): 将新的term 保存到I表;
优化(optimize): 清除I表的垃圾,主要是将已经被删除的term从I表删除。
当基表中的被索引文档发生insert、update、delete操作的时候,基表的改变并不能马上影响到索引上直到同步索引。可以查询视图CTX_USER_PENDING查看相应的改动。例如:
SELECT pnd_index_name, pnd_rowid,
TO_CHAR (pnd_timestamp, 'dd-mon-yyyy hh24:mi:ss') timestamp
FROM ctx_user_pending;
该语句的输出类似如下:
PND_INDEX_NAME PND_ROWID TIMESTAMP
------------------------------ ------------------ --------------------
MYINDEX AAADXnAABAAAS3SAAC 06-oct-1999 15:56:50
同步和优化方法: 可以使用Oracle提供的ctx_ddl包同步和优化索引,通过
DESC CTX_DDL可以查看ctx_ddl包的所有过程。
索引同步
l CTXSRV(同步进程)
Oracle提供一 个全文索引同步服务进程负责监视索引表变动并且第一时间同步索引。
只需要在后台运行 这个进程,它会监视数据的变化,及时进行同步。但由于存在一些问题在未来的ORACLE版本中将要被取代。启动同步索引服务进程方法:
HOST ctxsrv -user ctxsys/ctxsys>&/tmp/ctx.log&
当你启动了CTXSRV服务进程,在后台的同步请求处理就会像实时一样,在你提交修改1,2秒后新的数据马上就被索引了。 与手工同步相比,自动索引同步更容易使索引变的稀疏,需要执行DBMS_JOB定期优化和重建索引rebuild parameters( 'sync' )。 默认情况下,如果你不启动CTXSRV进程,索引不会自动更新除非你手工告诉它们去更新自己。你可以使用 alter index <iname> rebuild parameters ('sync') 更新索引。
ALTER INDEX search_idx REBUILD parameters( 'sync' )
/
Index altered.
9i提供了新的专门 用于更新索引的包ctx_ddl.sync_index(…)
l CTX_DDL.SYNC_INDEX(同步索引)
在对基表插入,修改,删除之后同步索引。推荐使用sync同步索引。
语法:
ctx_ddl.sync_index(
idx_name IN VARCHAR2 DEFAULT NULL
memory IN VARCHAR2 DEFAULT NULL,
part_name IN VARCHAR2 DEFAULT NULL
parallel_degree IN NUMBER DEFAULT 1);
idx_name 索引名称
memory 指定同步索引需要的内存。默认是系统参数DEFAULT_INDEX_MEMORY 。指定一个大的内存时候可以加快索引效率和查询速度,且 索引有较少的碎片
part_name 同步哪个分区索引。
parallel_degree 并行同步索引。设置并行度。
例如:
使用2M内存同步索引myindex:
BEGIN
ctx_ddl.sync_index ('myindex', '2M');
END;
NOTE:执行者必须是索引所有者或者CTXSYS用户。如果执行者是CTXSYS用户,索引名称可以是空NULL,这样默认优化全部的CONTEXT索引。这样的同步效果就如同ctxsrv. 我们推荐定期执行作业job同步索引。-- 为每一个索引制定单独的作业job, 一个 ctxsys 作业job同步全部索引。这样就减少了使用ctxsrv的机率,也不用在每次数据库启动后都要启动CTXSRV服务进程。由于CTXSRV有一些缺陷,在未来将不再会被ORACLE使用或者被取代。
INSERT INTO mytable
VALUES (2, 'first,second.this is the second rows before indexed');
COMMIT ;
EXEC ctx_ddl.sync_index('mytable_idx');--执行同步
SELECT /*+ FIRST_ROWS() */ ID, SCORE(1), TEXT
FROM MYTABLE
WHERE CONTAINS (TEXT, 'searchterm', 1) > 0
ORDER BY SCORE(1) DESC;
其中score(1)为Oracle为全文查询计算的主题符合程度。
更多信息参考:
http://docs.oracle.com/database/122/CCAPP/indexing-with-oracle-text.htm#CCAPP9123
(3.5 Managing DML Operations for a CONTEXT Index)
- 索引优化
经常的DML操作会导致CONTEXT索引产生碎片,索引碎片严重的影响了查询的反应速度。你可以定期优化索引来减少碎片,减少索引大小,提高查询效率。为了更好的理解索引优化,我们先看看索引的结构以及碎片是如何产生的。
CONTEXT索引 是反向索引,每一个索引项目都包括单词和这个单词所出现过的文档地址。例如在一个初始化索引过程中,单词DOG可以包括如下条目
DOG DOC1 DOC3 DOC5
当新的文档被包含到表的时候,索引被同步。如果新行DOC7也包括单词DOG,将会形成如下条目。
DOG DOC1 DOC3 DOC5
DOG DOC7
很多的DML操作以后,单词DOG的条目可能如下情况:
DOG DOC1 DOC3 DOC5
DOG DOC7
DOG DOC9
DOG DOC11
同步新增加的文档产生了索引碎片,单词DOG的文挡列表会越来越长,索引越来越大。你可以优化索引(CTX_DDL.OPTIMIZE_INDEX),使用fast, full, rebuild, token, token-type, or merge 等模式 降低索引碎片,提高索引效率。
Fast :这种方法仅仅使碎片行紧凑。但是,旧的数据并不从索引中删除。
Full :收缩数据的同时还移除旧的索引数据
Rebuild:在rebuild 模式下重建对应条目$I表,重建的效率比full快,通常用适用于比较小的索引,特别是对于碎片比较严重的索引。
注:rebuild 模式下创建了一个$I表的副本,也就是中间表,并与原$I表进行交换,因此需要与两倍的$I空间(如果开启了redo logging,那么redo 表空间也是需要增加的),在创建完后,原来的$I将会被删除,相应的存储空间可以重用。
Token:除了优化整个索引以外,你还可以专门对某个标记(token)进行优化。你可以仅仅优化那些经常查询的标记(token),而不必花太多时间在很少查询的单词上。 例如,你可以专门优化token DOG,它经常被检索或者经常被更新。这样可以提高查询这 个token的查询效率。
Token-type,类似于token
Merge:对于在context索引频繁使用DML操作,使用合并模式优化$I表是最好的,合并模式会从$G表中删除旧的数据,并进行压缩,然后在copy这些数据到$I表中去。
注:可使用CTX_REPORT.QUERY_LOG_SUMMARY查询token的频率
(更多内容参考http://docs.oracle.com/database/121/CCREF/cddlpkg.htm#CCREF0638)
Eg:
full模式:
BEGIN
ctx_ddl.optimize_index ('myidx', 'full');
END;
Token
begin
ctx_ddl.optimize_index('myidx','token', TOKEN=>'Oracle');
end;
FAST MODE
begin
ctx_ddl.optimize_index('myidx','FAST');
end;
begin
ctx_ddl.optimize_index('myidx',CTX_DDL.OPTLEVEL_FAST);
end;
Token-type:
begin
ctx_ddl.optimize_index('myindex', ctx_ddl.optlevel_token_type,
token_type=> ctx_report.token_type('myindex','field mysec text'));
end;
merge 模式:
begin
ctx_ddl.optimize_index('idx','MERGE');
end;
begin
ctx_ddl.optimize_index('idx',CTX_DDL.OPTLEVEL_MERGE);
end;
使用job定时同步和优化
用以下的两个job来完成(该job要建在和表同一个用户下) :
-- sync:
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');',
SYSDATE, 'SYSDATE + (1/24/4)');
commit;
END;
-- optimizer
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');',
SYSDATE, 'SYSDATE + 1');
commit;
END;
其中, 第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完 成。
-
- 查询
全文索引使用详细的使用方法参考:
http://docs.oracle.com/database/122/CCAPP/querying-with-oracle-text.htm#CCAPP9172
- 参考文档
https://oracle-base.com/articles/9i/full-text-indexing-using-oracle-text-9i
http://www.oracle.com/technetwork/database/enterprise-edition/default-1590763.html
http://docs.oracle.com/database/121/CCREF/cddlpkg.htm#CCREF0638
http://docs.oracle.com/database/121/CCREF/aviews.htm#CCREF24115
http://www.codeweblog.com/tag/oracle-text/
http://www.codeweblog.com/how-to-make-better-use-of-oracle-full-text-search/
- 附录
- oracle tex组件
查看相应的组件:
col comp_id for a15
col version for a15
col comp_name for a30
select comp_id,comp_name,version from dba_registry ;
10:13:53 ovsee@irpkm2> @dbreg
COMP_ID COMP_NAME VERSION
--------------- ------------------------------ ---------------
CONTEXT Oracle Text 10.2.0.5.0
EXF Oracle Expression Filter 10.2.0.5.0
OWM Oracle Workspace Manager 10.2.0.5.0
CATALOG Oracle Database Catalog Views 10.2.0.5.0
CATPROC Oracle Database Packages and T 10.2.0.5.0
ypes
JAVAVM JServer JAVA Virtual Machine 10.2.0.5.0
XML Oracle XDK 10.2.0.5.0
CATJAVA Oracle Database Java Packages 10.2.0.5.0
8 rows selected
10:14:51 ovsee@irpkm2>
MOS上的说明:
Oracle 8i/9i/10g/11g 组件(Components) 说明
http://blog.csdn.net/tianlesoftware/article/details/5937382
Oracle Text(全文索引) is available for no extra Licensing in all four database editions:Oracle Database Standard Edition One, Oracle Database Standard Edition (SE),Oracle Database Enterprise Edition (EE) and Oracle Database Personal Edition.Oracle Text uses standard SQL to index, search, and analyze text and documentsstored in the Oracle database, in files, and on the Web. Oracle Text canperform linguistic analysis on documents; search text using a variety ofstrategies including keyword searching, boolean operations, pattern matching,mixed thematic queries, HTML/XML section searching, etc. Oracle Text can rendersearch results in various formats including unformatted text, HTML withhighlighting, and original document format. Oracle Text supports multiplelanguages including Japanese, Korean, Traditional and Simplified Chinese.
Oracle Textindexes any document or textual content to add fast, accurate retrieval ofinformation to internet content management applications, e-Business catalogs,news services, job postings, and so on. It can index content stored in filesystems, databases, or on the Web.
--Oracle text(全文检索) 可以把任何文档和文件编入索引,从而是访问更快,更容易检索相关的信息。 Text 的索引可以存储在文件系统,数据库或者Web。
Oracle Text allows text searches to be combined with regular database searches in a singleSQL statement. It can find documents based on their textual content, metadata,or attributes. The Oracle Text SQL API makes it simple and intuitive to createand maintain Text indexes and run Text searches.
-
- Oracle Text 组件使用的用户
CTXSYS/CTXSYS The Oracle Text account
-
- Oracle text 安装
- Manualinstallation of Text 10gR1 (10.1.0.x)
1. Text dictionary, schema name CTXSYS, iscreated by calling following script from SQL*Plus connected as SYSDBA:
--使用如下脚本。
SQL> connect SYS/password@tns_ as SYSDBA
SQL> spool text_install.txt
SQL> @?/ctx/admin/catctx.sql CTXSYS SYSAUX TEMP NOLOCK
--脚本中各个参数含义:
CTXSYS - is the ctxsys user password
SYSAUX - is the default tablespace for ctxsys
TEMP - is the temporary tablespace for ctxsys
LOCK|NOLOCK - ctxsys user account will be locked or not
2. The next step is to install appropriatelanguage-specific default preferences.
--指定默认的安装语言
There is scriptwhich creates language-specific default preferences for every language Oracletext supports in /ctx/admin/defaults directory, such as English(US),Danish(DK), Dutch(NL), Finnish(SF), French(F), German(D), Italian(IT),Portuguese(PT), Spanish(E), and Swedish(S). They are named in the formdrdefXX.sql, where XX is the international license plate code.
To manuallyinstall US default preferences, for example, log into sqlplus as CTXSYS, andrun 'drdefus.sql' as described below:
--如果使用US作为默认语言,执行drdefus.sql.
SQL> connect CTXSYS/password@tns_alias
SQL> @?/ctx/admin/defaults/drdefus.sql
SQL> spool off
注意:
If you haveinstalled Oracle Data Mining (ODM) before Text you will see in thetext_install.txt logfile ORA-955 errors for public synonyms, e.g. dm_svm_build,which can be ignored. We have a dummy package that mimics the API in CTXSYSschema, and we attempt to create public synonyms to it. Now, if ODM has beeninstalled, these public synonym creates fail and the public synonyms point toODM objects, which is what we want.
-
- 卸载Text 组件
在卸载Oracle Text 组件之前,最好先drop 掉CTXSYS 用户上的所有Text indexes,确认没有问题后调用如下脚本删除Text dictionary,CTXSYS用户:
SQL> connect SYS/password as SYSDBA
SQL> spool text_deinstall.log
SQL> @?/ctx/admin/catnoctx.sql
SQL> drop procedure sys.validate_context;
SQL> spool off
Review the output file text_deinstall.log for errors.
注意事项:
(1)ORA-04043 for droppingsys.validate_context can be ignored, as in base release version this procedurewas owned by ctxsys and needs to be owned by sys.
(2)When Data Mining is not installedand we deinstall Oracle Text, catnoctx.sql will not drop the Data Mining publicsynonyms and they must be removed manually
--如果没有安装Data Mining 组件,那么在删除Text 组件时,DataMining 的公共同义词不会被删除,需要手工的移除,命令如下:
-- Drop CTXSYS publicsynonyms using the commands:
SQL> set hea off
SQL> spool /path/drop_ctxsys_synonyms.sql
SQL> select 'Drop public synonym ' || SYNONYM_NAME || ' ;' from DBA_SYNONYMSwhere TABLE_OWNER = 'CTXSYS';
SQL> spool off
SQL> @/path/drop_ctxsys_synonyms.sql
Deinstallation of Oracle Text is now complete.
-
- Oracle 11gR2 中重建 Oracle Text 组件
- 安装
- Oracle 11gR2 中重建 Oracle Text 组件
1. Text dictionary, schema name CTXSYS, iscreated by calling following script from SQL*Plus connected as SYSDBA:
SQL> connect SYS/password as SYSDBA
SQL> spool text_install.txt
SQL> @?/ctx/admin/catctx.sql change_on_install SYSAUX TEMP NOLOCK
--各个参数含义:
change_on_install - is the ctxsys userpassword
SYSAUX - is the default tablespace for ctxsys
TEMP - is the temporary tablespace for ctxsys
LOCK|NOLOCK - ctxsys user account will be locked or not
2. The next step is to install appropriatelanguage-specific default preferences.
There is scriptwhich creates language-specific default preferences for every language OracleText supports in $O_H/ctx/admin/defaults directory, such as English(US),Danish(DK), Dutch(NL), Finnish(SF), French(F), German(D), Italian(IT),Portuguese(PT), Spanish(E), and Swedish(S). They are named in the formdrdefXX.sql, where XX is the international license plate code.
To manuallyinstall American default preferences, for example, log into sqlplus as CTXSYS,and run following statement:
SQL> connect"CTXSYS"/"change_on_install"
SQL> @?/ctx/admin/defaults/dr0defin.sql "AMERICAN";
SQL> connect SYS/password as SYSDBA
SQL> alter user ctxsys account lock password expire;
SQL> spool off
注意:在一些系统上使用Text 必须指定相关参数。下表列出了不同操作系统上ctxhx依赖的变量,这些变量必须指定:
Platform: Requires path set: ENV variable:
--------------------- --------------------- -------------------
Linux x86-64 YES LD_LIBRARY_PATH
Solaris SPARC64 YES LD_LIBRARY_PATH
IBMAIX YES LIBPATH
HP PA-RISC YES SHLIB_PATH
HP Itanium YES LD_LIBRARY_PATH
- If you have the C Shell (csh or tcsh), enter the following:
$ setenv LD_LIBRARY_PATH $ORACLE_HOME/ctx/lib:$LD_LIBRARY_PATH
- If you have the Bourne shell (sh), Bash shell (bash),or Korn shell (ksh), enter the following:
$ export LD_LIBRARY_PATH=$ORACLE_HOME/ctx/lib:$LD_LIBRARY_PATH
Run thefollowing command to check if the LD_LIBRARY_PATH environmental variable is setcorrectly:
$ echo $LD_LIBRARY_PATH
-
-
- 删除
-
Before deinstalling Oracle Text, it is best to first drop all Text Indexes built inschemas other than CTXSYS.
When deinstalling Oracle Text, for example to get rid of an invalid or corrupt extenvironment, it should immediately be followed by a reinstallation of Text dueto the dependency of other components on Text objects.
Text dictionaryis removed by calling following script from SQL*Plus connected as SYSDBA:
SQL> connect SYS/password as SYSDBA
SQL> spool text_deinstall.log
SQL> @?/ctx/admin/catnoctx.sql
SQL> drop procedure sys.validate_context;
SQL> spool off
-
-
- 验证安装
-
1. Check to make sure that all Text objectswere created in CTXSYS schema and correct version is installed
2. Check to make sure that there are not invalid objects for CTXSYS.
You should get: "no rows selected".
connect SYS/password as SYSDBA
set pages 1000
col object_name format a40
col object_type format a20
col comp_name format a30
column library_name format a8
column file_spec format a60 wrap
spool text_install_verification.log
-- check on setup
select comp_name, status, substr(version,1,10) as version from dba_registrywhere comp_id = 'CONTEXT';
select * from ctxsys.ctx_version;
select substr(ctxsys.dri_version,1,10) VER_CODE from dual;
select count(*) from dba_objects where owner='CTXSYS';
-- Get a summary count
select object_type, count(*) from dba_objects where owner='CTXSYS' group byobject_type;
-- Any invalid objects
select object_name, object_type, status from dba_objects where owner='CTXSYS'and status != 'VALID' order by object_name;
spool off
查看输出:
select comp_name, status,substr(version,1,10) as version from dba_registry where comp_id = 'CONTEXT';
select substr(ctxsys.dri_version,1,10) VER_CODE from dual;
select count(*) from dba_objects where owner='CTXSYS';
select object_type, count(*) from dba_objects where owner='CTXSYS'group by object_type;
-
- 12c 中oracle text组件安装与删除
1.安装参考NOTE:1666831.1 - How To Manually Install Oracle Text In 12cR1?
2.删除Manual De-Install of Oracle Text In 12.1.0.2 [2067145.1]
注:
Manual installation/deinstallation of Oracle Text is not supported in 12c Release 1. The deinstall and install scripts are found in the installed oracle home but using them may break the multi tenant option in Oracle 12c. Currently in Oracle 12c All options have to be present.
-
- MOS 文档
Note579601.1 Manual installation, deinstallation and verification of Oracle Text 11gR1
Note.970473.1 Manualinstallation, deinstallation and verification of Oracle Text 11gR2
Note.280713.1 Manualinstallation, deinstallation of Oracle Text 10gR1 and 10gR2
Note.275689.1 Manualinstallation, deinstallation of Oracle Text 9.2.0.x
Note.150316.1 Manualinstallation of Oracle Text version 9.0.1
Note.73605.1 Installationof Oracle Text version 8.1.x (formally interMedia Text)
Note.177233.1 Manualdeinstallation of Oracle Text (Intermedia Text)
Note.159959.1 Howto Install Oracle Text 9.0.1 using Scripts
NOTE:1666831.1 - How To Manually Install Oracle Text In 12cR1?
-
- 全文索引的常见问题
MOS:Frequently Asked Questions for Oracle Text[ID 153264.1]
What is Oracle Text?
Can you enumerate the main features ofOracle Text?
What is the official Web page forOracle Text?
What's the official documentation forOracle Text?
What is the difference between ConTextand Oracle Text?
How do you determine what version ofOracle Text you are running?
Are there any books on Oracle Text?
How do you manually install Oracle Text?
How do I check my Text installationand setup?
How do you configure Oracle Text withan existing database using Database Configuration Assistant (DBCA)?
Does Text work with Replication?
Can you partition an text index?
Does Text work with Real ApplicationCluster(RAC)?
How do you tune a Text Query?
How do you empty CTX_INDEX_ERRORSview?
How do you drop an index that is inFAILED or LOADING state?
Should I use CTX_DDL or ALTER INDEX tomaintain my index?
Can you query an text index during theoptimization process?
Does Oracle Text create theme indexesby default?
What does "ABOUT" mean in aquery?
Where can I find working code samples?
My index creation seemed to succeed,but my searches don't find any information. Why not?
What are Document Services?
What are the Filters used by OracleText?
Can I Build Indexes on XML AttributeValues?
Can I Create a Text Index on More ThanOne Column?
How Fast is Text at Indexing?
How do I increase the score for adocument?
The CTXSYS account is locked. How do Iunlock the account?
ORA-28575: unable to open RPCconnection to external procedure agent while using CTX_DOC.IFILTER
Create index error: ORA-00955: name isalready used by an existing object
基于11g ODI(Oracle Identity Manager) domain index 最佳实践与常见问题参见:
http://www.oracle.com/technetwork/articles/idm/gupta-oim-catalog-2210900.html
- 结语
本文介绍了oracle 全文索引的相关类型,结构原理,以及DML管理与优化时相应的优化,主要参考oracle 官网文档及相应的网络文摘,由于本人水平有限,且在全文索引使用上,实践经验不多,欢迎大家批评指正。
来源:oschina
链接:https://my.oschina.net/zhiyonghe/blog/3147102