oracle全文索引之FILTER_2_INSO_FILTER

jolly10發表於2009-05-18
這篇文章繼續介紹全文索引的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部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1022211/,如需轉載,請註明出處,否則將追究法律責任。

相關文章