ORACLE TEXT DATASTORE PREFERENCE(三)
這篇文章繼續討論全文索引的DATASTORE屬性,介紹FILE_DATASTORE。
全文索引的對象一般是篇幅較大的文章,除了保存在數據庫中的情況,另外一種常見的情況是以文件的形式保存在操作系統中。
Oracle的FILE_DATASTORE屬性就可以索引這種類型的文檔。這個例子主要是討論DATASTORE屬性,因此索引的文章都是文本格式的,對于其他類型需要設置FILTER屬性,會在以后的例子單獨討論。
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已創建。
SQL> INSERT INTO T VALUES (1, 'OUTPUT.TXT');
已創建?1 行。
SQL> INSERT INTO T VALUES (2, 'LOGEMPXT_000_2012_2680.LOG');
已創建?1 行。
SQL> COMMIT;
提交完成。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_FILE', 'PATH', 'F:TEST');
4 END;
5 /
PL/SQL 過程已成功完成。
SQL> CONN YANGTK/YANGTK@YANGTK
已連接。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_FILE');
索引已創建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;
ID DOCS
---------- ------------------------------
1 OUTPUT.TXT
這個例子也是首先創建一個FILE_DATASTORE的PREFERENCE,并設置文件存儲的路徑,然后在建立索引的時候指定新建的參數。
但是,Oracle似乎只支持在FILE_DATASTORE中設置的路徑中進行搜索,即使像上面這個例子中第2條記錄,文檔存儲在指定路徑下的子目錄中,這種情況也是沒有辦法進行索引的。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;
未選定行
如果將文件位置從F:TESTLOG挪到F:TEST目錄下,則可以進行索引:
SQL> HOST MOVE F:TESTLOGEMPXT_000_2012_2680.LOG F:TESTEMPXT_000_2012_2680.LOG
SQL> UPDATE T SET DOCS = 'EMPXT_000_2012_2680.LOG' WHERE ID = 2;
已更新?1 行。
SQL> COMMIT;
提交完成。
SQL> BEGIN
2 CTX_DDL.SYNC_INDEX('IND_T_DOCS');
3 END;
4 /
PL/SQL 過程已成功完成。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;
ID DOCS
---------- ------------------------------
2 EMPXT_000_2012_2680.LOG
測試還發現,只有將文件置于F:TEST目錄下即可,即使DOCS中存儲的文件位置包含了子目錄信息。
下面不改變文件的存儲位置,只是修改保存在數據庫中的文檔的地址:
SQL> UPDATE T SET DOCS = 'LOGEMPXT_000_2012_2680.LOG' WHERE ID = 2;
已更新?1 行。
SQL> COMMIT;
提交完成。
SQL> BEGIN
2 CTX_DDL.SYNC_INDEX('IND_T_DOCS');
3 END;
4 /
PL/SQL 過程已成功完成。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;
ID DOCS
---------- ------------------------------
2 LOGEMPXT_000_2012_2680.LOG
對于這種情況,可以通過在設置路徑屬性時設置多個路徑的方式:
SQL> HOST MOVE F:TESTEMPXT_000_2012_2680.LOG F:TESTLOGEMPXT_000_2012_2680.LOG
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連接。
SQL> BEGIN
2 CTX_DDL.DROP_PREFERENCE('TEST_FILE');
3 END;
4 /
PL/SQL 過程已成功完成。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE');
3 CTX_DDL.SET_ATTRIBUTE('TEST_FILE', 'PATH', 'F:TEST;F:TESTLOG');
4 END;
5 /
PL/SQL 過程已成功完成。
SQL> CONN YANGTK/YANGTK@YANGTK
已連接。
SQL> DROP INDEX IND_T_DOCS;
索引已丟棄。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_FILE');
索引已創建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;
ID DOCS
---------- ------------------------------
1 OUTPUT.TXT
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;
ID DOCS
---------- ------------------------------
2 LOGEMPXT_000_2012_2680.LOG
這種文檔保存在Oracle之外的方式,如果文件發生了變化,必須通過修改索引列的方式來通知Oracle,被索引數據已經發生了變化。
總結
以上是生活随笔為你收集整理的ORACLE TEXT DATASTORE PREFERENCE(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE TEXT DATASTOR
- 下一篇: ORACLE TEXT DATASTOR