oracle文本的功能与其他oracle软件产品之间的差异

时间:2015-11-04 08:18:30

标签: oracle oracle9i

Oracle Text的功能与其他Oracle产品的区别是什么? Oracle数据库具有良好的索引功能,那么为什么我必须使用Oracle Text来执行索引和检索文本?

1 个答案:

答案 0 :(得分: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列包含“Oracle”一词的所有记录。使用标准运算符有几种选择。例如

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

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

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

相比之下,Text索引将字符串拆分为标记,并为每次出现的标记编制索引。

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

因此,使用Text,我们可以编写如下查询:

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> 

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

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

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