oracle全文索引之FILTER_4_PROCEDURE_FILTER
這篇文章繼續介紹全文索引的FILTER屬性,介紹全文索引的PROCEDURE_FILTER屬性。
對於一些複雜的需求,Oracle 自定義的FILTER可能並不合適,Oracle支援使用者自己編寫用於FILTER的程式。Oracle提供兩種方式,一種是USER_FILTER一種 是PROCEDURE_FILTER。USER_FILTER是使用者編譯好的命令列程式,而PROCEDURE_FILTER是呼叫使用者編寫的儲存過程。
[@more@]下面舉一個PROCEDURE_FILTER的例子,在例子中被索引的文件為純文字格式,要求是不索引文件中註釋部分的內容。這種要求是預定義FILTER無法達到的,只能透過PROCEDURE_FILTER的方式來解決,下面看這個例子:SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(4000));
表已建立。
SQL> INSERT INTO T VALUES (1, 'This is a example for procedure filter.
2 In the this example, the words in comments are not indexed.');
已建立 1 行。
SQL> INSERT INTO T VALUES (2, '--This line should not be indexed.
2 /* And this two lines
3 should not be indexed too. */
4 Only this line is the real context.');
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT;
索引已建立。
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;
ID
----------
2
1
對於普通的索引,是不會區分註釋內容和正文內容的。
SQL> DROP INDEX IND_T_DOCS;
索引已丟棄。
SQL> CREATE OR REPLACE FUNCTION F_COMMENTS (P_STR IN VARCHAR2, P_FLAG IN NUMBER) RETURN VARCHAR2 AS
2 V_POSITION1 NUMBER;
3 V_POSITION2 NUMBER;
4 BEGIN
5 IF P_FLAG = 0 THEN
6 V_POSITION1 := INSTR(P_STR, '/*');
7 V_POSITION2 := INSTR(P_STR, '--');
8 IF V_POSITION1 = 0 THEN
9 V_POSITION1 := 40000;
10 END IF;
11 IF V_POSITION2 = 0 THEN
12 V_POSITION2 := 40000;
13 END IF;
14 IF V_POSITION1 < V_POSITION2 THEN
15 RETURN SUBSTR(P_STR, 1, V_POSITION1 - 1) || F_COMMENTS(SUBSTR(P_STR, V_POSITION1 + 2), 1);
16 ELSIF V_POSITION2 < V_POSITION1 THEN
17 RETURN SUBSTR(P_STR, 1, V_POSITION2 - 1) || F_COMMENTS(SUBSTR(P_STR, V_POSITION2 + 2), 2);
18 ELSE
19 RETURN P_STR;
20 END IF;
21 ELSIF P_FLAG = 1 THEN
22 RETURN F_COMMENTS(SUBSTR(P_STR, INSTR(P_STR, '*/') + 2), 0);
23 ELSIF P_FLAG = 2 THEN
24 V_POSITION2 := INSTR(P_STR, CHR(10));
25 IF V_POSITION2 != 0 THEN
26 RETURN F_COMMENTS(SUBSTR(P_STR, V_POSITION2 + 1), 0);
27 ELSE
28 RETURN NULL;
29 END IF;
30 END IF;
31 END;
32 /
函式已建立。
SQL> CREATE OR REPLACE PROCEDURE P_MYFILTER (P_INSTR IN VARCHAR2, P_OUTSTR IN OUT VARCHAR2) AS
2 BEGIN
3 P_OUTSTR := F_COMMENTS(P_INSTR, 0);
4 END;
5 /
過程已建立。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連線。
SQL> CREATE OR REPLACE PROCEDURE P_TESTFILTER(P_INSTR IN VARCHAR2, P_OUTSTR IN OUT VARCHAR2) AS
2 BEGIN
3 YANGTK.P_MYFILTER(P_INSTR, P_OUTSTR);
4 END;
5 /
過程已建立。
SQL> GRANT EXECUTE ON P_TESTFILTER TO YANGTK;
授權成功。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_PROCEDURE_FILTER', 'PROCEDURE_FILTER');
3 CTX_DDL.SET_ATTRIBUTE('TEST_PROCEDURE_FILTER', 'PROCEDURE', 'P_TESTFILTER');
4 CTX_DDL.SET_ATTRIBUTE('TEST_PROCEDURE_FILTER', 'INPUT_TYPE', 'VARCHAR2');
5 CTX_DDL.SET_ATTRIBUTE('TEST_PROCEDURE_FILTER', 'OUTPUT_TYPE', 'VARCHAR2');
6 END;
7 /
PL/SQL 過程已成功完成。
SQL> CONN YANGTK/YANGTK@YANGTK
已連線。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('FILTER CTXSYS.TEST_PROCEDURE_FILTER');
索引已建立。
SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;
ID
----------
1
PROCEDURE_FILTER屬性的設定方法和USER_DATASTORE屬性的設定方法十分類似,都是必須使用CTXSYS使用者來呼叫使用者編譯的過程。且CTXSYS使用者封裝的過程還必須授權給建立索引的使用者。
使用自定義的過程來進行過濾,將文件內容中的註釋內容過濾掉,索引查詢的內容已經不包含註釋的內容了。
對於如何判斷註釋內容,可以參考:http://yangtingkun.itpub.net/post/468/184024
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1022218/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle全文索引之STORAGE PREFERENCEOracle索引
- oracle全文索引之WORDLIST PREFERENCEOracle索引
- oracle全文索引之幾個關鍵表Oracle索引
- oracle全文索引之commit與DML操作Oracle索引MIT
- oracle全文索引之如何實現查詢Oracle索引
- oracle全文索引之STOPLIST_4_MULTI_STOPLISTOracle索引
- oracle全文索引之STOPLIST_3_DEFAULT_STOPLISTOracle索引
- oracle全文索引之STOPLIST_2_EMPTY_STOPLISTOracle索引
- oracle全文索引之STOPLIST_1_BASIC_STOPLISTOracle索引
- oracle全文索引之LEXER_4_MULTI_LEXEROracle索引
- oracle全文索引之LEXER_3_DEFAULT_LEXEROracle索引
- oracle全文索引之LEXER_2_CHINESE_LEXEROracle索引
- oracle全文索引之LEXER_1_BASIC_LEXEROracle索引
- oracle全文索引之FILTER_3_FORMAT_COLUMNOracle索引FilterORM
- oracle全文索引之FILTER_1_NULL_FILTEROracle索引FilterNull
- oracle全文索引之datastore_6_NESTED_DATASTOREOracle索引AST
- oracle全文索引之datastore_5_detail_datastoreOracle索引ASTAI
- oracle全文索引之datastore_4_URL_DATASTOREOracle索引AST
- oracle全文索引之datastore_3_FILE_DATASTOREOracle索引AST
- oracle全文索引之datastore_1_DIRECT_DATASTOREOracle索引AST
- Oracle:全文索引Oracle索引
- oracle全文索引之配置全文檢索環境Oracle索引
- oracle 之全文索引表的分割槽交換案例Oracle索引
- oracle全文索引之About_INDEX_THEMES操作Oracle索引Index
- oracle全文索引之STOPLIST_ CTXCAT 索引_INDEX SETOracle索引Index
- oracle全文索引之datastore_2_MULTI_COLUMN_DATASTOREOracle索引AST
- Oracle的全文索引Oracle索引
- ZT oracle全文索引Oracle索引
- oracle全文索引之SECTION GROUP_6_PATH_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_5_AUTO_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_4_XML_SECTION_GROUPOracle索引XML
- oracle全文索引之SECTION GROUP_3_HTML_SECTION_GROUPOracle索引HTML
- oracle全文索引之SECTION GROUP_2_BASIC_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_1_NULL_SECTION_GROUPOracle索引Null
- oracle全文索引之FILTER_2_INSO_FILTEROracle索引Filter
- oracle 全文索引的配置Oracle索引
- MongoDB之索引(全文索引)MongoDB索引
- oracle全文索引之同步和優化索引做了什麼Oracle索引優化