1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

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。

DROPTABLEDOCS; 
CREATETABLEDOCS( 
idNUMBERPRIMARYKEY, 
textVARCHAR2(80) 
); 
INSERTINTOdocsVALUES(1,'thefirstdoc'); 
INSERTINTOdocsVALUES(2,'theseconddoc'); 
COMMIT; 
CREATEINDEXdoc_indexONDOCS(text)INDEXTYPEISCTXSYS.CONTEXT;

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

stringconnStr="DataSource=ora9;uid=scott;pwd=tiger;unicode=true"; 
stringsqlStr="SELECTIDFROMDOCSWHERECONTAINS(TEXT,'%FIRST%')>0"; 
OracleDataAdapterda=newOracleDataAdapter(sqlStr,connStr); 
DataTabledt=newDataTable(); 
da.Fill(dt); 
Response.Write(dt.Rows[0][0].ToString());

同步和优化

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

同步sync

将新的term保存到I表。

createorreplaceproceduresyncis 
begin 
executeimmediate'alterindexdoc_indexrebuildonline'|| 
'parameters(''sync'')'; 
executeimmediate'alterindexdoc_indexrebuildonline'|| 
'parameters(''optimizefullmaxtimeunlimited'')'; 
endsync;

优化

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

declare 
v_jobnumber; 
begin 
Dbms_Job.Submit 
( 
job=>v_job, 
what=>'sync;', 
next_date=>sysdate,/*default*/ 
interval=>'sysdate+1/720'/*=1day/(24hrs*30min)=2mins*/ 
); 
Dbms_Job.Run(v_job); 
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下的全文检索更好。

本文来源:1818IP

本文地址:https://www.1818ip.com/post/10689.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。