2015-11-04 30 views
0

与其他Oracle产品相比,Oracle Text的功能有什么区别? Oracle数据库具有良好的索引功能,所以为什么我需要使用Oracle Text来执行索引和检索文本?oracle文本与其他oracle软件产品功能的区别

+0

也许我的英文不够好,但我认为你的问题并不清楚:Oracle Text是Oracle数据库的集成组件。在寻求帮助之前,您应该阅读文档(http://docs.oracle.com/cd/E11882_01/text.112/e24436/toc.htm) – Cyryl1972

回答

1

考虑此表及其数据:

create table t23 
    (id number, 
    txt varchar2(4000) 
    ) 
/
insert into t23 
select 1, 'Please read the Oracle documentation' from dual union all 
select 2, 'This is some sample text' from dual union all 
select 3, 'We all love Oracle database' from dual union all 
select 4, 'It has so many features' from dual union all 
select 5, 'What is full text search anyway?' from dual 
/

的任务是发现所有在txt列包含单词“甲骨文”的记录。有几种使用标准操作符的选项。例如

select * from t23 
where txt like '%Oracle%' 
/

select * from t23 
where instr(txt,'Oracle') > 0 
/

但这些查询将执行全表扫描。这样的玩具桌不是问题,而是现实生活中的一大痛苦。在txt上构建B树索引将无济于事。因为整个字符串都是索引的,所以索引可能只在搜索字符串的前导部分时有用,即where text like 'Oracle%'(甚至可能不是)。

相比之下,文本索引将字符串拆分为令牌和每次出现的令牌的索引。

CREATE INDEX t23_txt_idx ON t23(txt) INDEXTYPE IS CTXSYS.CONTEXT; 

因此,与文字,我们可以写这样的查询:

select * from t23 
where contains(txt,'Oracle') > 0 
/

将在表演方式执行:

SQL> select * from table(dbms_xplan.display); 

    PLAN_TABLE_OUTPUT 
    ------------------------------------------------------------------------------------------------------------------------------------------------------ 
    Plan hash value: 4178983470 

    ------------------------------------------------------------------------------------------- 
    | Id | Operation     | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
    ------------------------------------------------------------------------------------------- 
    | 0 | SELECT STATEMENT   |    |  1 | 2027 |  4 (0)| 00:00:01 | 
    | 1 | TABLE ACCESS BY INDEX ROWID| T23   |  1 | 2027 |  4 (0)| 00:00:01 | 
    |* 2 | DOMAIN INDEX    | T23_TXT_IDX |  |  |  4 (0)| 00:00:01 | 
    ------------------------------------------------------------------------------------------- 

    Predicate Information (identified by operation id): 
    --------------------------------------------------- 

     2 - access("CTXSYS"."CONTAINS"("TXT",'Oracle')>0) 

    Note 
    ----- 
     - dynamic sampling used for this statement (level=2) 

    18 rows selected. 

    SQL> 

索引的这种形式适合于大量的自由文本,包括文档。

文本索引的成本是它们的维护,它非常高,可能不是事务性的(并且取决于索引类型)。因此,当我们确实需要定期搜索字符串的内容时,合理使用文本索引非常重要。 Find out more

现在Oracle Text是常规数据库的一部分。不过,我看到你已经标记了你的问题[Oracle9i]。文字是Standard Edition in 9iR2的一部分,不知道R1。