oracle全文索引之datastore_2_MULTI_COLUMN_DATASTORE

jolly10發表於2009-05-14
繼續討論全文索引的DATASTORE屬性,介紹MULTI_COLUMN_DATASTORE。[@more@]

如果被索引的文章是儲存在資料庫中,但是內容分佈在多個列中,那麼可以透過建立一個MULTI_COLUMN_DATASTORE來索引完整的文章:

SQL> CREATE TABLE T (ID NUMBER, DOC1 VARCHAR2(4000), DOC2 VARCHAR2(4000), DOC3 VARCHAR2(4000));

表已建立。

SQL> INSERT INTO T VALUES (1,
2 'The first paragraph of article in doc1.',
3 'The second partments is the doc2.',
4 'The last content is in the doc3.');

已建立 1 行。

SQL> INSERT INTO T VALUES (2,
2 'This example create a multi-column datastore preference',
3 'called test_multicol on three text columns',
4 'to be concatenated and indexed.');

已建立 1 行。

SQL> COMMIT;

提交完成。

下面建立索引,由於需要建立一個多列儲存的全文索引,需要將多個列的列名作為引數傳給Oracle。這個過程透過建立一個PREFERENCE,並設定屬性來完成。

注意,下面的程式碼需要由CTXSYS使用者執行,這點是文件上沒有明確說明的。

SQL> CONN CTXSYS/CTXSYS@YANGTK
已連線。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_MULTICOL', 'MULTI_COLUMN_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_MULTICOL', 'COLUMNS', 'DOC1, DOC2, DOC3');
4 END;
5 /

PL/SQL 過程已成功完成。

下面在建立索引的時候指定DATASTORE引數為新建的TEST_MULTICOL引數:

SQL> CONN YANGTK/YANGTK@YANGTK
已連線。
SQL> CREATE INDEX IND_T_DOCS ON T (DOC1) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_MULTICOL');

索引已建立。

SQL> SELECT * FROM T WHERE CONTAINS(DOC1, 'CONTENT') > 0;

ID
----------
DOC1
---------------------------------------------------------------------------
DOC2
---------------------------------------------------------------------------
DOC3
---------------------------------------------------------------------------
1
The first paragraph of article in doc1.
The second partments is the doc2.
The last content is in the doc3.

透過查詢的結果可以發現,這個多列的全文索引已經生效。

SQL> SELECT * FROM T WHERE CONTAINS(DOC2, 'CONTENT') > 0;
SELECT * FROM T WHERE CONTAINS(DOC2, 'CONTENT') > 0
*
ERROR 位於第 1 行:
ORA-20000: Oracle Text error:
DRG-10599: 列沒有編制索引


SQL> CREATE INDEX IND_T_DOCS2 ON T (DOC2) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_MULTICOL');

索引已建立。

SQL> SELECT * FROM T WHERE CONTAINS(DOC2, 'CONTENT') > 0;

ID
----------
DOC1
----------------------------------------------------------------------------
DOC2
----------------------------------------------------------------------------
DOC3
----------------------------------------------------------------------------
1
The first paragraph of article in doc1.
The second partments is the doc2.
The last content is in the doc3.

透過上面的例子可以看出,對於多列的全文索引可以建立在多個列的任意一列上,但是,在查詢時指定的列必須與索引時指定的列保持一致。

最後注意一點,只有索引指定的列發生修改,Oracle才會認為被索引資料發生了變化,僅僅修改其他列而沒有修改索引列,即使同步索引也不會將修改同步到索引中。

SQL> DROP INDEX IND_T_DOCS2;

索引已丟棄。

SQL> SELECT * FROM CTX_USER_PENDING;

未選定行

SQL> UPDATE T SET COL3 = NULL WHERE ID = 1;
UPDATE T SET COL3 = NULL WHERE ID = 1
*
ERROR 位於第 1 行:
ORA-00904: "COL3": 無效的識別符號


SQL> UPDATE T SET DOC3 = NULL WHERE ID = 1;

已更新 1 行。

SQL> SELECT * FROM CTX_USER_PENDING;

未選定行

SQL> UPDATE T SET DOC1 = NULL WHERE ID = 1;

已更新 1 行。

SQL> SELECT * FROM CTX_USER_PENDING;

PND_INDEX_NAME PND_PARTITION_NAME PND_ROWID PND_TIMEST
-------------------------- ------------------ ------------------ ----------
IND_T_DOCS AAAJXiAAMAAAAAGAAA 25-7月 -06

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1022074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章