oracle全文索引之datastore_3_FILE_DATASTORE

DATASTORE是FILE_DATASTORE的测试[@more@][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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/271283/viewspace-1022075/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/271283/viewspace-1022075/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释分析细致讲解一下这段代码int ncds_file_editconfig_internal (struct ncds_ds *ds, NC_DATASTORE target, char config) { struct ncds_ds_file * file_ds = (struct ncds_ds_file )ds; xmlDocPtr config_doc, datastore_doc; xmlNodePtr target_ds, tmp_target_ds, aux_node, root; int retval = EXIT_SUCCESS, ret; char aux = NULL; const char configp; LOCK(file_ds,ret); if (ret) { return EXIT_FAILURE; } DBG("enter %s/%d\n", func,LINE); if(file_fill_dsnodes(file_ds)) { UNLOCK(file_ds); ERROR("%s: file_ds->running_all/startup_all/candidate_all is NULL\n", func); return EXIT_FAILURE; } DBG("%s step1\n", func); file_rollback_store(file_ds); switch(target) { case NC_DATASTORE_RUNNING: target_ds = file_ds->running; break; case NC_DATASTORE_STARTUP: target_ds = file_ds->startup; break; case NC_DATASTORE_CANDIDATE: target_ds = file_ds->candidate; break; default: UNLOCK(file_ds); ERROR("%s: invalid target.", func); return EXIT_FAILURE; break; } if (strncmp(config, "<?xml", 5) == 0) { if ((configp = strchr(config, '>')) == NULL) { UNLOCK(file_ds); ERROR("%s: invalid config.", func); return EXIT_FAILURE; } ++configp; while (*configp == ' ' || *configp == '\n' || configp == '\t') { ++configp; } } else { configp = config; } if (asprintf(&aux, "<config>%s</config>", configp) == -1) { UNLOCK(file_ds); ERROR("asprintf() failed (%s:%d).", FILE, LINE); return EXIT_FAILURE; } if ((config_doc = xmlReadMemory (aux, strlen(aux), NULL, NULL, NC_XMLREAD_OPTIONS)) == NULL) { UNLOCK(file_ds); free(aux); ERROR("%s: Reading xml data failed!", func); return EXIT_FAILURE; } free(aux); root = xmlDocGetRootElement(config_doc); for (aux_node = root->children; aux_node != NULL; aux_node = root->children) { xmlUnlinkNode(aux_node); xmlAddNextSibling(config_doc->last, aux_node); } aux_node = root->next; xmlUnlinkNode(root); xmlFreeNode(root); datastore_doc = xmlNewDoc (BAD_CAST "1.0"); xmlDocSetRootElement(datastore_doc, xmlCopyNode(target_ds->children, 1)); if (target_ds->children) { for (root = target_ds->children->next; root != NULL; root = aux_node) { aux_node = root->next; xmlAddNextSibling(datastore_doc->last, xmlCopyNode(root, 1)); } } retval = edit_config_internal(datastore_doc, config_doc, (struct ncds_ds)file_ds, NC_EDIT_DEFOP_NOTSET); if (EXIT_SUCCESS == retval) { #if 1 while ((aux_node = target_ds->children) != NULL) { xmlUnlinkNode(aux_node); xmlFreeNode(aux_node); } xmlAddChildList(target_ds, xmlCopyNodeList(datastore_doc->children)); if (file_sync(file_ds)) { retval = EXIT_FAILURE; } #endif } else { retval = EXIT_FAILURE; } UNLOCK(file_ds); xmlFreeDoc (datastore_doc); xmlFreeDoc (config_doc); return retval; }
06-09

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值