Oracle C#实现Oracle Text全文检索的简单例子

数据库 Oracle
本文我们主要介绍了Oracle C#实现Oracle Text全文检索的一个简单例子,通过这个例子让我们一起来了解一下Oracle C#实现Oracle Text全文检索的过程吧,希望能够对您有所帮助。

Oracle C#实现Oracle Text全文检索的简单例子是本文我们主要要介绍的内容,.NET下用C# 实现Oracle Text全文检索的一个简单例子,旨在初步了解Oracle全文检索的大概步骤,你可以此基础上扩展,进行进一步的学习。希望能够对您有所帮助。

Oracle全文检索的步骤如下:

(1) 建表并装载文本。

(2) 建立索引。如果想配置Oracle索引,可以在建立索引前进行配置,如:改变词法分析器。可以下面SQL语句查看Oracle全文检索的配置:SELECT * FROM CTX_PREFERENCES;

(3) SQL查询。

(4) 索引维护:同步与优化。

授权

执行全文的用户必须具有 CTXAPP角色 或 CTXSYS用户,以及 CTX_DDL包 执行权限。

(1) 用 SYS用户 授予 SCOTT 用户 CTXAPP 角色,命令如下:

GRANT CTXAPP TO SCOTT;

(2) 用 CTXSYS 用户 给 SCOTT 用户 授权 CTX_DDL 包的执行权限,命令如下:

GRANT EXECUTE ON CTX_DLL TO SCOTT;

创建表、添加记录和索引

以下的SQL语句和 JOB都在 SCOTT 用户下执行。首先,执行以下 SQL 语句,创建表 DOCS,并插入两条记录,提交后创建索引 doc_index。

 

  1. DROP TABLE DOCS;  
  2. CREATE TABLE DOCS (  
  3. id NUMBER PRIMARY KEY,  
  4. text VARCHAR2(80)  
  5. );   
  6. INSERT INTO docs VALUES (1,'the first doc');  
  7. INSERT INTO docs VALUES (2,'the second doc');  
  8. COMMIT;   
  9. CREATE INDEX doc_index ON DOCS(text) INDEXTYPE IS CTXSYS.CONTEXT; 

 

然后,执行查询,C#代码如下:

 

  1. string connStr="Data Source=ora9; uid=scott; pwd=tiger; unicode=true";   
  2. string sqlStr = "SELECT ID FROM DOCS WHERE CONTAINS(TEXT,'%FIRST%')>0";  
  3. OracleDataAdapter da = new OracleDataAdapter(sqlStr, connStr);  
  4. DataTable dt = new DataTable();  
  5. da.Fill(dt);  
  6. Response.Write(dt.Rows[0][0].ToString());  

 

同步和优化

当表DOCS 发生变化(插入,删除)后,索引必须能反应这个变化,这就需要对索引进行同步和优化。Oracle提供 ctx server 完成同步和优化,也可以用以下的job来完成。

同步sync

将新的term保存到I表。

 

  1. create or replace procedure sync is  
  2. begin  
  3. execute immediate 'alter index doc_index rebuild online' ||  
  4. ' parameters ( ''sync'' )';  
  5. execute immediate 'alter index doc_index rebuild online' ||  
  6. ' parameters ( ''optimize full maxtime unlimited'' )';  
  7. end sync;  

 

优化

清除I表的垃圾,将已经被删除的term从I表删除。

 

  1. declare  
  2. v_job number;  
  3. begin  
  4. Dbms_Job.Submit  
  5. (  
  6. job => v_job,  
  7. what => 'sync;',  
  8. next_date => sysdate, /* default */  
  9. interval => 'sysdate + 1/720' /* = 1 day / ( 24 hrs * 30 min) = 2 mins */  
  10. );  
  11. Dbms_Job.Run ( v_job );  
  12. end;  

 

其中,I表是 dr$doc_index$i 表。用户建立索引后,Oracle会自动创建四个表,dr$doc_index$i、dr$doc_index$k、dr$doc_index$n和dr$doc_index$r。可以用SELECT语句查看此表的内容。

说明:

(1) 本文是在Oracle 9i和10g环境下完全实现Oracle的全文检索,包括建立表和索引,进行同步和优化;

(2) 进行全文检索的SQL语句是"SELECT ID FROM DOCS WHERE CONTAINS(TEXT,'%FIRST%')>0";

(3) 其中,">0"是有效的Oracle SQL所必需的,因为,Oracle SQL不支持函数的布尔返回值;

(4) 其中,"CONTAINS(TEXT,'%FIRST%')>0",在Oracle 9i和10g与11g下有所不同;

(5) 最近做项目从Oracle 10g改成11g,在进行全文检索时,Oracle 10g下的代码,在11g下检索不到结果;

(6) 初步认为,Oracle 9i和10g与11g的区别是,在9i和10g下,如果不使用“%”,则是精确检索,否则是模糊检索。而在11g下,则完全不用“%”;

(7) 另外,在9i和10g下,可以使用如:CONTAINS(TEXT,'%FIRST% AND %second%')>0,进行全文检索,但在11g下,是不可以的,要分开写,如:

CONTAINS(TEXT,'%FIRST%')>0 AND CONTAINS(TEXT,'%second%')>0;

(8) 感觉11g下的全文检索更好。

以上就是Oracle C#实现Oracle Text全文检索的例子的全部内容,本文我们就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. Oracle数据库PL/SQL快捷键设置详解
  2. Oracle数据库学习笔记之表的联合查询
  3. 一个Oracle数据库执行存储过程的错误解决
  4. Oracle数据库日期范围搜索的两种方法简介
  5. Oracle数据库RMAN恢复之数据文件的恢复详解
责任编辑:赵鹏 来源: 博客园
相关推荐

2010-05-04 12:18:43

Oracle Text

2009-03-19 10:24:27

全文检索文本定位Oracle

2010-11-10 14:18:15

SQL SERVER全

2009-09-11 09:10:30

C#编写游戏

2010-04-19 17:21:36

Oracle写文件

2011-08-03 10:40:17

SQL Server数全文检索

2010-07-08 14:53:38

SQLServer实现

2009-08-14 11:24:10

MySQL全文检索MySQL Like索

2009-09-07 15:27:04

C# MessageB

2009-08-13 10:15:50

C#读取Excel

2011-05-13 14:34:31

Oracle全文索引设置

2009-08-12 16:37:22

C#变量类型转换

2009-08-24 18:09:13

C#调用Oracle数

2018-08-22 14:25:42

搜索LuceneQuery

2011-08-02 12:46:46

Oracle数据表建立索引

2010-04-16 11:22:08

Oracle存储过程

2010-10-26 15:21:11

连接Oracle数据库

2010-04-13 17:10:59

Oracle Data

2009-08-31 17:53:20

C#实现索引器

2009-09-02 14:33:57

C#类实现接口
点赞
收藏

51CTO技术栈公众号