ORACLE TEXT FILTER PREFERENCE(四)
这篇文章继续介绍全文索引的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(四)相关推荐
- ORACLE TEXT FILTER PREFERENCE(一)
介绍完Oracle全文索引的DATASTORE属性,继续介绍Oracle的FILTER属性. Oracle全文索引的FILTER属性主要是针对具有一定格式的文档,Oracle根据FILTER的设定来过 ...
- ORACLE TEXT FILTER PREFERENCE(三)
这篇文章继续介绍全文索引的FILTER属性,介绍对不同类型的数据采用不同类型的FILTER属性的方法. 如果Oracle索引的文档包括多种类型,比如doc文件.html文件.pdf文件.纯文本文件等等 ...
- ORACLE TEXT FILTER PREFERENCE(二)
这篇文章继续介绍全文索引的FILTER属性,介绍Oracle的INSO_FILTER属性. Oracle的全文索引除了可以支持文本文件外,还可以支持多种文档格式,对于这些文档格式,在建立索引的时候需要 ...
- ORACLE TEXT DATASTORE PREFERENCE(二)
这篇文章继续讨论全文索引的DATASTORE属性,介绍MULTI_COLUMN_DATASTORE. 如果被索引的文章是保存在数据库中,但是内容分布在多个列中,那么可以通过建立一个MULTI_COLU ...
- ORACLE TEXT DATASTORE PREFERENCE(一)
Oracle Text功能十分强大,可是文档上给出的例子总是过于简单,而且可能是为了减少篇幅,不少例子只给出了其中关键的几步,但是对于初学者而言,阅读这样的例子很难对全文索引的创建有一个清晰的了解,而 ...
- ORACLE TEXT DATASTORE PREFERENCE(四)
这篇文章继续讨论全文索引的DATASTORE属性,介绍URL_DATASTORE. 全文索引可以很方便的索引存储在INTERNET上的信息.在数据库中只需要存储需要索引的文章的URL就可以了. 由于目 ...
- ORACLE TEXT LEXER PREFERENCE(四)
本文继续介绍Oracle全文索引的LEXER属性,这篇文章介绍Oracle多语言全文索引DEFAULT_LEXER. 其实这篇文章应该放在LEXER属性的开头部分,不过我的测试一直和Oracle文档上 ...
- ORACLE TEXT DATASTORE PREFERENCE(五)
这篇文章继续讨论全文索引的DATASTORE属性,介绍DETAIL_DATASTORE. 全文索引运行将被索引的数据存储在子表的多条记录中,下面看一个简单的例子: SQL> CREATE TAB ...
- ORACLE TEXT DATASTORE PREFERENCE(三)
这篇文章继续讨论全文索引的DATASTORE属性,介绍FILE_DATASTORE. 全文索引的对象一般是篇幅较大的文章,除了保存在数据库中的情况,另外一种常见的情况是以文件的形式保存在操作系统中. ...
最新文章
- JavaWeb之文件上传
- Altair PollEx 2020中文版
- matlab考试资料,MATLAB复习资料
- javascript函数式_如何以及为什么在现代JavaScript中使用函数式编程
- LaTeX:equation, aligned 书写公式换行,顶部对齐
- 饥荒机器人怎么用避雷针充电_饥荒避雷针有什么用
- Linux内核同步机制--自旋锁【转】
- The /usr/local/mysql/data directory is not owned by the 'mysql' to '_mysql' user
- java程序调用xfire发布的webService服务(二)
- 酷Q插件dll 加载失败!错误:缺失AppInfo返回的AppID(york.1996.com)对应的文件(-110)
- 基于MATLAB的特殊函数与画图(附图像与代码)
- Android C++ OpenGL教程课程总结
- 两条平滑曲线相乘_圆锥曲线中两条相交直线的斜率之积为定值,这点你可能不会用...
- 嵌入式面试常见问题(一)
- 采集器 mysql_搜索结果 : mysql - 火车采集器帮助中心
- 10分钟!Mac配置Win主机上的共享打印机
- iOS UIFont 字体名字大全
- CEIWEI ParallelMonitor并口监控 v3.0 并口打印机监控, 并口打开印机, 并行端口过滤, 并行端口监控, 并口过滤, 并口监控
- 解决h5 在微信放大字体中的问题
- 10个重要的电子邮件ip黑名单组织以及如何解决删除
热门文章
- java 实现set,Java--Set的三个具体实现类
- 【团队管理】改造团队成员?
- [视频教程] 如何在Linux深度系统deepin下安装docker
- CodeForces 1213F (强联通分量分解+拓扑排序)
- (一)U盘安装ubuntu18.04.1
- python315题的漫漫通关之路
- SQL中删除重复的行(重复数据),只保留一行 转
- 找规律 百度之星资格赛 1001 大搬家
- 1350 Taxi Cab Scheme DAG最小路径覆盖
- 【Servlet3.0新特性】第03节_文件上传