ITPub博客

首页 > 数据库 > Oracle > oracle全文索引之FILTER_2_INSO_FILTER

oracle全文索引之FILTER_2_INSO_FILTER

原创 Oracle 作者:jolly10 时间:2009-05-18 10:34:54 0 删除 编辑
这篇文章继续介绍全文索引的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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-02-20

  • 博文量
    263
  • 访问量
    826719