您的位置:首页 > 数据库 > Oracle

oracle全文索引之datastore_3_FILE_DATASTORE

2010-01-08 14:29 344 查看
DATASTORE是FILE_DATASTORE的测试

[oracle@rhel140 ~]$ cat OUTPUT.TXT

ORACLE

oracle

[oracle@rhel140 LOG]$ cat EMPXT_000_2012_2680.LOG

SOURCE

ABC

SQL> conn myuser/myuser

Connected.

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

Table created.

SQL> INSERT INTO T VALUES (1, 'OUTPUT.TXT');

1 row created.

SQL> commit;

Commit complete.

SQL> BEGIN

2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE');

3 CTX_DDL.SET_ATTRIBUTE('TEST_FILE', 'PATH', '/home/oracle');

4 END;

5 /

PL/SQL procedure successfully completed.

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT

PARAMETERS ('DATASTORE TEST_FILE'); 2

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;

ID DOCS

---- --------------------

1 OUTPUT.TXT

需要注意的是在建立PREFERENCE的PATH属性时不能用客户端的目录和文件,一定是服务器端的目录和文件,

我用WINDOWS的目录时,在dr$index_error中就会出现下面的错误

SQL> select * from ctxsys.dr$index_error;

ERR_IDX_ID ERR_TIMES ERR_TEXTKEY

---------- --------- ------------------

ERR_TEXT

--------------------------------------------------------------------------------

1181 13-MAY-09 AAAM52AAEAAAAGkAAA

DRG-11513: unable to open or write to file /home/oracle/OUTPUT.TXT

SQL> INSERT INTO T VALUES (2, 'LOG/EMPXT_000_2012_2680.LOG');

1 row created.

SQL> commit;

Commit complete.

SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

no rows selected

Oracle似乎只支持在FILE_DATASTORE中设置的路径中进行搜索,即使像上面这个例子中第2条记录,文档存储在

指定路径下的子目录中,这种情况也是没有办法进行索引的。

如果将文件位置从/home/oracle/LOG挪到/home/oracle目录下,则可以进行索引:

SQL> host mv /home/oracle/LOG/EMPXT_000_2012_2680.LOG /home/oracle

SQL> UPDATE T SET DOCS = 'EMPXT_000_2012_2680.LOG' WHERE ID = 2;

1 row updated.

SQL> COMMIT;

Commit complete.

SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

ID

----------

DOCS

--------------------------------------------------------------------------------

2

EMPXT_000_2012_2680.LOG

测试还发现,只要将文件置于/home/oracle目录下即可,即使DOCS中存储的文件位置是子目录的信息。

下面不改变文件的存储位置,只是修改保存在数据库中的文档的地址:

SQL> UPDATE T SET DOCS = 'LOG/EMPXT_000_2012_2680.LOG' WHERE ID = 2;

1 row updated.

SQL> commit;

Commit complete.

SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

ID

----------

DOCS

--------------------------------------------------------------------------------

2

LOG/EMPXT_000_2012_2680.LOG

看yangtingkun的实验是可以在一个PATH里指定多少目录,但我试了是不行的,不知是为什么

SQL> host mv /home/oracle/EMPXT_000_2012_2680.LOG /home/oracle/LOG/EMPXT_000_2012_2680.LOG

SQL> exec CTX_DDL.DROP_PREFERENCE('TEST_FILE');

PL/SQL procedure successfully completed.

SQL> BEGIN

2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE')

3 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE')

SQL> BEGIN

2 CTX_DDL.CREATE_PREFERENCE('TEST_FILE', 'FILE_DATASTORE');

3 CTX_DDL.SET_ATTRIBUTE('TEST_FILE', 'PATH', '/home/oracle;/home/oracle/LOG');

4 end;

5 /

PL/SQL procedure successfully completed.

SQL> DROP INDEX IND_T_DOCS;

Index dropped.

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT

2 PARAMETERS ('DATASTORE TEST_FILE');

Index created.

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;

no rows selected

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'SOURCE') > 0;

no rows selected

表ctxsys.dr$index_error的错误如下,就是找不到目录

[oracle@rhel140 LOG]$ sqlplus ctxsys/ctxsys

SQL> select * from ctxsys.dr$index_error;

ERR_IDX_ID ERR_TIMES ERR_TEXTKEY

---------- --------- ------------------

ERR_TEXT

--------------------------------------------------------------------------------

1261 14-MAY-09 AAAM6dAAEAAAAG+AAA

DRG-11513: unable to open or write to file /home/oracle;/home/oracle/LOG/OUTPUT.

TXT

1261 14-MAY-09 AAAM6dAAEAAAAG/AAA

DRG-11513: unable to open or write to file /home/oracle;/home/oracle/LOG/EMPXT_0

00_2012_2680.LOG
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: