ORACLE TEXT DATASTORE PREFERENCE(二)
這篇文章繼續(xù)討論全文索引的DATASTORE屬性,介紹MULTI_COLUMN_DATASTORE。
如果被索引的文章是保存在數(shù)據(jù)庫中,但是內(nèi)容分布在多個列中,那么可以通過建立一個MULTI_COLUMN_DATASTORE來索引完整的文章:
SQL> CREATE TABLE T (ID NUMBER, DOC1 VARCHAR2(4000), DOC2 VARCHAR2(4000), DOC3 VARCHAR2(4000));
表已創(chuàng)建。
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.');
已創(chuàng)建?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.');
已創(chuàng)建?1 行。
SQL> COMMIT;
提交完成。
下面創(chuàng)建索引,由于需要建立一個多列存儲的全文索引,需要將多個列的列名作為參數(shù)傳給Oracle。這個過程通過建立一個PREFERENCE,并設置屬性來完成。
注意,下面的代碼需要由CTXSYS用戶執(zhí)行,這點是文檔上沒有明確說明的。
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參數(shù)為新建的TEST_MULTICOL參數(shù):
SQL> CONN YANGTK/YANGTK@YANGTK
已連接。
SQL> CREATE INDEX IND_T_DOCS ON T (DOC1) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_MULTICOL');
索引已創(chuàng)建。
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.
通過查詢的結(jié)果可以發(fā)現(xiàn),這個多列的全文索引已經(jīng)生效。
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');
索引已創(chuàng)建。
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.
通過上面的例子可以看出,對于多列的全文索引可以建立在多個列的任意一列上,但是,在查詢時指定的列必須與索引時指定的列保持一致。
最后注意一點,只有索引指定的列發(fā)生修改,Oracle才會認為被索引數(shù)據(jù)發(fā)生了變化,僅僅修改其他列而沒有修改索引列,即使同步索引也不會將修改同步到索引中。
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
總結(jié)
以上是生活随笔為你收集整理的ORACLE TEXT DATASTORE PREFERENCE(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE TEXT DATASTOR
- 下一篇: ORACLE TEXT DATASTOR