Oracle Text功能十分强大,可是文档上给出的例子总是过于简单,而且可能是为了减少篇幅,不少例子只给出了其中关键的几步,但是对于初学者而言,阅读这样的例子很难对全文索引的创建有一个清晰的了解,而更多的时候可能会使初学者更加迷茫。
打算通过一系列的文章对Oracle全文索引做一个比较详细的描述。里面会对包含很多例子,而且例子会覆盖Oracle全文索引的大部分内容。
这篇文章首先从全文索引的DATASTORE属性开始,介绍DATASTORE中的最简单的DIRECT DATASTORE。
Oracle的全文索引不要求被索引的文章一定存储在数据库中,不过如果文章存储在数据库的一列中,那么这种情况建立索引是最简单的。
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(4000));
表已创建。
SQL> INSERT INTO T VALUES (1, 'This is a sample for Oracle TEXT.');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, 'This is a direct database store sample');
已创建 1 行。
SQL> COMMIT;
提交完成。
对于上面提到的DIRECT DATASTORE类型,下面三种创建索引方式是等价的:
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'DATABASE') > 0;
ID DOCS
---------- ----------------------------------------
2 This is a direct database store sample
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'DATABASE') > 0;
ID DOCS
---------- ----------------------------------------
2 This is a direct database store sample
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.DIRECT_DATASTORE');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'DATABASE') > 0;
ID DOCS
---------- ----------------------------------------
2 This is a direct database store sample
上面给出了一个最简单的全文索引的例子。
另外,由DR$开头的4张表是系统为了支持全文索引而自动生成的,不过这4张表的用处就不再这里讨论了。
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DR$IND_T_DOCS$I TABLE
DR$IND_T_DOCS$K TABLE
DR$IND_T_DOCS$N TABLE
DR$IND_T_DOCS$R TABLE
T TABLE