程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle C#實現Oracle Text全文檢索的簡單例子

Oracle C#實現Oracle Text全文檢索的簡單例子

編輯:Oracle數據庫基礎

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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved