文档库 最新最全的文档下载
当前位置:文档库 › oracle域索引简介

oracle域索引简介

Oracle 全文检索
王力 2009-08-06
Oracle 从8i之前,就有了全文检索功能。到9i之后,基本可以放心使用。
建立的Oracle Text索引被称为域索引(domain index),包括4种索引类型: CONTEXT, CTXCAT, CTXRULE or CTXXPATH。
在4种索引中,最常用的就是 CONTEXT索引,使用最通用的CONTAINS操作符进行查询。
下面通过简单案例介绍一下使用的方法。
1. 准备工作
conn / as sysdba
create tablespace do_ind datafile '/u01/app/oracle/oradata/dbtest/do_ind1.dbf' size 100m;
alter user ctxsys account unlock identified by ctxsys;

conn ctxsys/ctxsys
grant execute on ctx_ddl to scott;

conn scott/tiger
-- 普通表
create table t1
(name varchar2(10),
sdate date,
info varchar2(500))

-- 分区表
create table t2
(name varchar2(10),
sdate date,
info varchar2(500))
partition by range (sdate)
(partition p2007 values less than(to_date('20080101','yyyymmdd')) ,
partition p2008 values less than(to_date('20090101','yyyymmdd')) ,
partition p2009 values less than(to_date('20100101','yyyymmdd')));

2. 定义域索引参数
BEGIN
--ctx_ddl.drop_preference ('my_lexer');
--ctx_ddl.drop_preference ('mystore');
-- 语法分析
ctx_ddl.create_preference ('my_lexer', 'chinese_lexer');
-- 存储参数
ctx_ddl.create_preference ('mystore', 'BASIC_STORAGE');
ctx_ddl.set_attribute ('mystore', 'I_TABLE_CLAUSE', 'tablespace do_ind ');
ctx_ddl.set_attribute ('mystore', 'I_INDEX_CLAUSE', 'tablespace do_ind compress 2 ');
ctx_ddl.set_attribute ('mystore', 'K_TABLE_CLAUSE', 'tablespace do_ind');
ctx_ddl.set_attribute ('mystore', 'R_TABLE_CLAUSE', 'tablespace do_ind');
ctx_ddl.set_attribute ('mystore', 'N_TABLE_CLAUSE', 'tablespace do_ind');
END;
/

3. 建立索引
语法如下:
CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS
ctxsys.context [ONLINE]
LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]
[, PARTITION [partition] [PARAMETERS('paramstring')]])]
[PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];

CREATE INDEX ctx_ind_t1 ON t1(info) INDEXTYPE is CTXSYS.CONTEXT
parameters('lexer my_lexer storage mystore');

CREATE INDEX ctx_ind_t2 ON t2(info) INDEXTYPE is CTXSYS.CONTEXT
local
parameters('lexer my_lexer storage mystore');

4. 简单查询
select * from t1 where contains(info,'吃了吗')>0

5. 索引的同步和优化
Context 类型的域索引并不随着dml操作同步索引,需要定期同步索引。同步的方法有三种,使用ctxctl命令、系统包以及sql语句。使用ctxctl命令已经不再推荐,就介绍包和sql语句的同步方法。
? 同步索引
对于分区索引,无法整个进行同步
1.使用ctx_ddl.sync_index
PROCEDURE SYNC_INDEX
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
IDX_NAME VARCHAR

2 IN DEFAULT
MEMORY VARCHAR2 IN DEFAULT
PART_NAME VARCHAR2 IN DEFAULT
PARALLEL_DEGREE NUMBER IN DEFAULT
exec ctx_ddl.sync_index
(IDX_NAME => 'CTX_IND_T2',PART_NAME => 'P2008', PARALLEL_DEGREE => 2);
或者
alter index ctx_ind_t2 rebuild partition p2008 parameters ('sync');

? 优化索引
同样,分区索引也不能整个优化
使用ctx_ddl.optimize_index
PROCEDURE OPTIMIZE_INDEX
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
IDX_NAME VARCHAR2 IN
OPTLEVEL VARCHAR2 IN
MAXTIME NUMBER IN DEFAULT
TOKEN VARCHAR2 IN DEFAULT
PART_NAME VARCHAR2 IN DEFAULT
TOKEN_TYPE NUMBER IN DEFAULT
PARALLEL_DEGREE NUMBER IN DEFAULT
exec ctx_ddl.optimize_index ('CTX_IND_T2', 'full',PART_NAME=>'P2009');

6. 其他
? 分区表无法指定新加分区索引的TBS
ALTER INDEX xxx MODIFY DEFAULT ATTRIBUTES TABLESPACE xxx;
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option
------
begin
ctx_ddl.set_attribute ('mystore', 'I_TABLE_CLAUSE', 'tablespace users ');
ctx_ddl.set_attribute ('mystore', 'I_INDEX_CLAUSE', 'tablespace users compress 2 ');
ctx_ddl.set_attribute ('mystore', 'K_TABLE_CLAUSE', 'tablespace users');
ctx_ddl.set_attribute ('mystore', 'R_TABLE_CLAUSE', 'tablespace users');
ctx_ddl.set_attribute ('mystore', 'N_TABLE_CLAUSE', 'tablespace users');
end;
/

alter table t2 add partition p2030 values less than (to_date('20310101','yyyymmdd'));
新加分区依然在do_ind表空间

? 相关视图无效
alter index ctx_ind_t2 unusable;
查询遇到ORA-29954 分区索引不可用

但是相关表存在问题
Select idx_name,idx_status from ctxsys.ctx_indexes;
IDX_NAME IDX_STATUS
------------------------------ ------------
DEFAULT_POLICY_ORACONTAINS NO_INDEX
CTX_IND_T2 INDEXED
CTX_IND_T1 INDEXED
SUP_TEXT_IDX INDEXED

同样,CTX_INDEX_PARTITIONS 也无法定位错误

相关文档
相关文档 最新文档