这篇文章继续介绍全文索引的FILTER属性,介绍Oracle的INSO_FILTER属性。[@more@]
Oracle的全文索引除了可以支持文本文件外,还可以支持多种文档格式,对于这些文档格式,在建立索引的时候需要指定INSO_FILTER参数,使用这个过滤参数,Oracle的全文索引可以识别绝大部分的常见文档,比如:word、pdf等。
下面看一个索引文档的例子:
SQL> conn myuser/myuser
Connected.
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
Table created.
SQL> INSERT INTO T VALUES (1, 'pdf.pdf');
1 row created.
SQL> INSERT INTO T VALUES (2, 'doc1.doc');
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
2 PARAMETERS ('DATASTORE TEST_FILE FILTER CTXSYS.INSO_FILTER');
Index created.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;
ID
----------
DOCS
--------------------------------------------------------------------------------
1
pdf.pdf
2
doc1.doc
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'sina.com')>0;
ID
----------
DOCS
--------------------------------------------------------------------------------
1
pdf.pdf
下面试试如果修改文档的内容,是否还能查询得到?
先在doc1.doc中新入一行"ericlu"字符。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ericlu')>0;
no rows selected
SQL> exec CTX_DDL.SYNC_INDEX('IND_T_DOCS');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ericlu')>0;
no rows selected
同步过索引依然找不到
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 FILTER CTXSYS.INSO_FILTER');
Index created.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ericlu')>0;
ID
----------
DOCS
--------------------------------------------------------------------------------
2
doc1.doc
重建后可以找到,下面试了rebuild也可以的。
先在doc1.doc中加入"my cups"字符。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'my cups')>0;
no rows selected
SQL> alter index IND_T_DOCS rebuild;
Index altered.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'my cups')>0;
ID
----------
DOCS
--------------------------------------------------------------------------------
2
doc1.doc
FILTER的默认值并不是一成不变的,这个默认值会受索引字段类型和DATASTORE的类型的影响。在上一篇文章中
的测试中,对于存储在数据库中的VARCHAR2、CHAR和CLOB字段中的数据,Oracle自动选择了NULL_FILTEL。在这
里DATASTORE的属性为FILE_DATASTORE,则Oracle会默认选择 INSO_FILTER作为默认值。
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 FILTER CTXSYS.INSO_FILTER');
Index created.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'ORACLE') > 0;
ID
----------
DOCS
--------------------------------------------------------------------------------
1
pdf.pdf
2
doc1.doc
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;
ID
----------
DOCS
--------------------------------------------------------------------------------
1
pdf.pdf
2
doc1.doc
可以发现默当DATASTORE的属性为FILE_DATASTORE,Oracle会选择 INSO_FILTER作为默认值。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/271283/viewspace-1022211/
,如需转载,请注明出处,否则将追究法律责任。