这篇文章继续讨论全文索引的DATASTORE属性,介绍URL_DATASTORE。
全文索引可以很方便的索引存储在INTERNET上的信息。在数据库中只需要存储需要索引的文章的URL就可以了。
由于目前讨论的是DATASTORE属性,因此这个例子只索引HTML文章,对于其他需要使用FILTER属性的文章,在以后讨论。
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已创建。
SQL> INSERT INTO T VALUES (1, 'http://yangtingkun.itpub.net/');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, 'http://www.itpub.net/');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_URL', 'URL_DATASTORE');
3 END;
4 /
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_URL');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;
ID DOCS
---------- ------------------------------
2 http://www.itpub.net/
1 http://yangtingkun.itpub.net/
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'YANGTINGKUN') > 0;
ID DOCS
---------- ------------------------------
2 http://www.itpub.net/
1 http://yangtingkun.itpub.net/
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'TIMESTEN') > 0;
ID DOCS
---------- ------------------------------
1 http://yangtingkun.itpub.net/
当时看Oracle的例子感觉URL_DATASTORE很复杂,但是测试之后才发现,使用起来还是很简单的。需要注意的就是,保证数据库所在服务器可以连到INTERNET上。
如果没有连接到被索引的页面,那么Oracle并不会报错,但是,所有的查询都不会返回记录。
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('DATASTORE CTXSYS.TEST_URL');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;
未选定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'YANGTINGKUN') > 0;
未选定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'TIMESTEN') > 0;
未选定行
如果需要代理才能连到INTERNET上,可以设置URL_DATASTORE的HTTP_PROXY等属性。URL_DATASTORE还包含很多的属性,这里就不详细的介绍了,Oracle的Text Reference文档上有比较详细的说明。
最后要说明的是,Oracle中仅仅保存被索引文档的URL地址,因此,如果文档本身发生了变化,Oracle是无法知道的,也无法去同步索引,这时必须通过修改索引列也就是URL地址列的方式来通知Oracle,被索引数据已经发生了变化。
使Oracle了解需要同步索引变化的最简单的方法类似于:UPDATE T SET DOCS = DOCS WHERE ID = 1;