这篇文章继续介绍全文索引的FILTER属性,介绍全文索引的PROCEDURE_FILTER属性。

对于一些复杂的需求,Oracle自定义的FILTER可能并不合适,Oracle支持用户自己编写用于FILTER的程序。Oracle提供两种方式,一种是USER_FILTER一种是PROCEDURE_FILTER。USER_FILTER是用户编译好的命令行程序,而PROCEDURE_FILTER是调用用户编写的存储过程。

下面举一个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

ORACLE TEXT FILTER PREFERENCE(四)相关推荐

  1. ORACLE TEXT FILTER PREFERENCE(一)

    介绍完Oracle全文索引的DATASTORE属性,继续介绍Oracle的FILTER属性. Oracle全文索引的FILTER属性主要是针对具有一定格式的文档,Oracle根据FILTER的设定来过 ...

  2. ORACLE TEXT FILTER PREFERENCE(三)

    这篇文章继续介绍全文索引的FILTER属性,介绍对不同类型的数据采用不同类型的FILTER属性的方法. 如果Oracle索引的文档包括多种类型,比如doc文件.html文件.pdf文件.纯文本文件等等 ...

  3. ORACLE TEXT FILTER PREFERENCE(二)

    这篇文章继续介绍全文索引的FILTER属性,介绍Oracle的INSO_FILTER属性. Oracle的全文索引除了可以支持文本文件外,还可以支持多种文档格式,对于这些文档格式,在建立索引的时候需要 ...

  4. ORACLE TEXT DATASTORE PREFERENCE(二)

    这篇文章继续讨论全文索引的DATASTORE属性,介绍MULTI_COLUMN_DATASTORE. 如果被索引的文章是保存在数据库中,但是内容分布在多个列中,那么可以通过建立一个MULTI_COLU ...

  5. ORACLE TEXT DATASTORE PREFERENCE(一)

    Oracle Text功能十分强大,可是文档上给出的例子总是过于简单,而且可能是为了减少篇幅,不少例子只给出了其中关键的几步,但是对于初学者而言,阅读这样的例子很难对全文索引的创建有一个清晰的了解,而 ...

  6. ORACLE TEXT DATASTORE PREFERENCE(四)

    这篇文章继续讨论全文索引的DATASTORE属性,介绍URL_DATASTORE. 全文索引可以很方便的索引存储在INTERNET上的信息.在数据库中只需要存储需要索引的文章的URL就可以了. 由于目 ...

  7. ORACLE TEXT LEXER PREFERENCE(四)

    本文继续介绍Oracle全文索引的LEXER属性,这篇文章介绍Oracle多语言全文索引DEFAULT_LEXER. 其实这篇文章应该放在LEXER属性的开头部分,不过我的测试一直和Oracle文档上 ...

  8. ORACLE TEXT DATASTORE PREFERENCE(五)

    这篇文章继续讨论全文索引的DATASTORE属性,介绍DETAIL_DATASTORE. 全文索引运行将被索引的数据存储在子表的多条记录中,下面看一个简单的例子: SQL> CREATE TAB ...

  9. ORACLE TEXT DATASTORE PREFERENCE(三)

    这篇文章继续讨论全文索引的DATASTORE属性,介绍FILE_DATASTORE. 全文索引的对象一般是篇幅较大的文章,除了保存在数据库中的情况,另外一种常见的情况是以文件的形式保存在操作系统中. ...

最新文章

  1. JavaWeb之文件上传
  2. Altair PollEx 2020中文版
  3. matlab考试资料,MATLAB复习资料
  4. javascript函数式_如何以及为什么在现代JavaScript中使用函数式编程
  5. LaTeX:equation, aligned 书写公式换行,顶部对齐
  6. 饥荒机器人怎么用避雷针充电_饥荒避雷针有什么用
  7. Linux内核同步机制--自旋锁【转】
  8. The /usr/local/mysql/data directory is not owned by the 'mysql' to '_mysql' user
  9. java程序调用xfire发布的webService服务(二)
  10. 酷Q插件dll 加载失败!错误:缺失AppInfo返回的AppID(york.1996.com)对应的文件(-110)
  11. 基于MATLAB的特殊函数与画图(附图像与代码)
  12. Android C++ OpenGL教程课程总结
  13. 两条平滑曲线相乘_圆锥曲线中两条相交直线的斜率之积为定值,这点你可能不会用...
  14. 嵌入式面试常见问题(一)
  15. 采集器 mysql_搜索结果 : mysql - 火车采集器帮助中心
  16. 10分钟!Mac配置Win主机上的共享打印机
  17. iOS UIFont 字体名字大全
  18. CEIWEI ParallelMonitor并口监控 v3.0 并口打印机监控, 并口打开印机, 并行端口过滤, 并行端口监控, 并口过滤, 并口监控
  19. 解决h5 在微信放大字体中的问题
  20. 10个重要的电子邮件ip黑名单组织以及如何解决删除

热门文章

  1. java 实现set,Java--Set的三个具体实现类
  2. 【团队管理】改造团队成员?
  3. [视频教程] 如何在Linux深度系统deepin下安装docker
  4. CodeForces 1213F (强联通分量分解+拓扑排序)
  5. (一)U盘安装ubuntu18.04.1
  6. python315题的漫漫通关之路
  7. SQL中删除重复的行(重复数据),只保留一行 转
  8. 找规律 百度之星资格赛 1001 大搬家
  9. 1350 Taxi Cab Scheme DAG最小路径覆盖
  10. 【Servlet3.0新特性】第03节_文件上传