日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ORACLE TEXT FILTER PREFERENCE(四)

發(fā)布時間:2024/8/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE TEXT FILTER PREFERENCE(四) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章繼續(xù)介紹全文索引的FILTER屬性,介紹全文索引的PROCEDURE_FILTER屬性。


對于一些復雜的需求,Oracle自定義的FILTER可能并不合適,Oracle支持用戶自己編寫用于FILTER的程序。Oracle提供兩種方式,一種是USER_FILTER一種是PROCEDURE_FILTER。USER_FILTER是用戶編譯好的命令行程序,而PROCEDURE_FILTER是調用用戶編寫的存儲過程。

下面舉一個PROCEDURE_FILTER的例子,在例子中被索引的文檔為純文本格式,要求是不索引文檔中注釋部分的內(nèi)容。這種要求是預定義FILTER無法達到的,只能通過PROCEDURE_FILTER的方式來解決,下面看這個例子:

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(4000));

表已創(chuàng)建。

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.');

已創(chuàng)建?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.');

已創(chuàng)建?1 行。

SQL> COMMIT;

提交完成。

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT;

索引已創(chuàng)建。

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;

ID
----------
2
1

對于普通的索引,是不會區(qū)分注釋內(nèi)容和正文內(nèi)容的。

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 /

函數(shù)已創(chuàng)建。

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 /

過程已創(chuàng)建。

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 /

過程已創(chuàng)建。

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');

索引已創(chuàng)建。

SQL> SELECT ID FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;

ID
----------
1

PROCEDURE_FILTER屬性的設置方法和USER_DATASTORE屬性的設置方法十分類似,都是必須使用CTXSYS用戶來調用用戶編譯的過程。且CTXSYS用戶封裝的過程還必須授權給建立索引的用戶。

使用自定義的過程來進行過濾,將文檔內(nèi)容中的注釋內(nèi)容過濾掉,索引查詢的內(nèi)容已經(jīng)不包含注釋的內(nèi)容了。

對于如何判斷注釋內(nèi)容,可以參考:http://yangtingkun.itpub.net/post/468/184024

總結

以上是生活随笔為你收集整理的ORACLE TEXT FILTER PREFERENCE(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。