Oracle C#實(shí)現(xiàn)Oracle Text全文檢索的簡單例子
Oracle C#實(shí)現(xiàn)Oracle Text全文檢索的簡單例子是本文我們主要要介紹的內(nèi)容,.NET下用C# 實(shí)現(xiàn)Oracle Text全文檢索的一個簡單例子,旨在初步了解Oracle全文檢索的大概步驟,你可以此基礎(chǔ)上擴(kuò)展,進(jìn)行進(jìn)一步的學(xué)習(xí)。希望能夠?qū)δ兴鶐椭?/p>
Oracle全文檢索的步驟如下:
(1) 建表并裝載文本。
(2) 建立索引。如果想配置Oracle索引,可以在建立索引前進(jìn)行配置,如:改變詞法分析器??梢韵旅鍿QL語句查看Oracle全文檢索的配置:SELECT * FROM CTX_PREFERENCES;
(3) SQL查詢。
(4) 索引維護(hù):同步與優(yōu)化。
授權(quán)
執(zhí)行全文的用戶必須具有 CTXAPP角色 或 CTXSYS用戶,以及 CTX_DDL包 執(zhí)行權(quán)限。
(1) 用 SYS用戶 授予 SCOTT 用戶 CTXAPP 角色,命令如下:
GRANT CTXAPP TO SCOTT;
(2) 用 CTXSYS 用戶 給 SCOTT 用戶 授權(quán) CTX_DDL 包的執(zhí)行權(quán)限,命令如下:
GRANT EXECUTE ON CTX_DLL TO SCOTT;
創(chuàng)建表、添加記錄和索引
以下的SQL語句和 JOB都在 SCOTT 用戶下執(zhí)行。首先,執(zhí)行以下 SQL 語句,創(chuàng)建表 DOCS,并插入兩條記錄,提交后創(chuàng)建索引 doc_index。
- DROP TABLE DOCS;
- CREATE TABLE DOCS (
- id NUMBER PRIMARY KEY,
- text VARCHAR2(80)
- );
- INSERT INTO docs VALUES (1,'the first doc');
- INSERT INTO docs VALUES (2,'the second doc');
- COMMIT;
- CREATE INDEX doc_index ON DOCS(text) INDEXTYPE IS CTXSYS.CONTEXT;
然后,執(zhí)行查詢,C#代碼如下:
- string connStr="Data Source=ora9; uid=scott; pwd=tiger; unicode=true";
- string sqlStr = "SELECT ID FROM DOCS WHERE CONTAINS(TEXT,'%FIRST%')>0";
- OracleDataAdapter da = new OracleDataAdapter(sqlStr, connStr);
- DataTable dt = new DataTable();
- da.Fill(dt);
- Response.Write(dt.Rows[0][0].ToString());
同步和優(yōu)化
當(dāng)表DOCS 發(fā)生變化(插入,刪除)后,索引必須能反應(yīng)這個變化,這就需要對索引進(jìn)行同步和優(yōu)化。Oracle提供 ctx server 完成同步和優(yōu)化,也可以用以下的job來完成。
同步sync
將新的term保存到I表。
- create or replace procedure sync is
- begin
- execute immediate 'alter index doc_index rebuild online' ||
- ' parameters ( ''sync'' )';
- execute immediate 'alter index doc_index rebuild online' ||
- ' parameters ( ''optimize full maxtime unlimited'' )';
- end sync;
優(yōu)化
清除I表的垃圾,將已經(jīng)被刪除的term從I表刪除。
- declare
- v_job number;
- begin
- Dbms_Job.Submit
- (
- job => v_job,
- what => 'sync;',
- next_date => sysdate, /* default */
- interval => 'sysdate + 1/720' /* = 1 day / ( 24 hrs * 30 min) = 2 mins */
- );
- Dbms_Job.Run ( v_job );
- end;
其中,I表是 dr$doc_index$i 表。用戶建立索引后,Oracle會自動創(chuàng)建四個表,dr$doc_index$i、dr$doc_index$k、dr$doc_index$n和dr$doc_index$r。可以用SELECT語句查看此表的內(nèi)容。
說明:
(1) 本文是在Oracle 9i和10g環(huán)境下完全實(shí)現(xiàn)Oracle的全文檢索,包括建立表和索引,進(jìn)行同步和優(yōu)化;
(2) 進(jìn)行全文檢索的SQL語句是"SELECT ID FROM DOCS WHERE CONTAINS(TEXT,'%FIRST%')>0";
(3) 其中,">0"是有效的Oracle SQL所必需的,因?yàn)?,Oracle SQL不支持函數(shù)的布爾返回值;
(4) 其中,"CONTAINS(TEXT,'%FIRST%')>0",在Oracle 9i和10g與11g下有所不同;
(5) 最近做項(xiàng)目從Oracle 10g改成11g,在進(jìn)行全文檢索時,Oracle 10g下的代碼,在11g下檢索不到結(jié)果;
(6) 初步認(rèn)為,Oracle 9i和10g與11g的區(qū)別是,在9i和10g下,如果不使用“%”,則是精確檢索,否則是模糊檢索。而在11g下,則完全不用“%”;
(7) 另外,在9i和10g下,可以使用如:CONTAINS(TEXT,'%FIRST% AND %second%')>0,進(jìn)行全文檢索,但在11g下,是不可以的,要分開寫,如:
CONTAINS(TEXT,'%FIRST%')>0 AND CONTAINS(TEXT,'%second%')>0;
(8) 感覺11g下的全文檢索更好。
以上就是Oracle C#實(shí)現(xiàn)Oracle Text全文檢索的例子的全部內(nèi)容,本文我們就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






