ORACLE 全文索引功能實現學習筆記
前言: 數據庫工程師眾所周知的一個事實是,當對數據庫里的文本字段進行like檢索的時候,任何數據索引都是不起作用的,這樣也就導致系統會承擔額外的開銷和負載壓力,對于龐大的數據記錄,對其中的文本字段進行關鍵字匹配,就肯定會存在非常嚴重的效率障礙和性能障礙。因此,基于文本的全文索引技術也就逐漸興起。
全文索引的技術原理并不復雜,對段落性的文本內容進行逐詞分解,并針對詞出現頻率,出現位置進行標記,按照詞本身的編碼順序存儲為索引文件。這樣,在針對關鍵詞進行檢索的時候,就不會遍歷所有的文本數據記錄,而是根據索引文件進行有序查找,這里面一個顯見的事實是,通過有序索引查找關鍵詞,對于海量的數據記錄而言,也只需要很少次數的指針跳轉,(數量為X的索引記錄,查詢特定記錄的指針跳轉次數最多為Log2(x)。)即可完成搜索,而無須完整遍歷整個數據表或文件集。
但是全文索引技術的實現卻并不簡單,針對中文的尤其如此,英文文本中,空格是天然的分詞標記,而中文段落卻無法通過這樣簡單的途徑分詞,因此基于常用語詞典和一些語言識別規則的分詞技術成為一種非常高的技術門檻,幸好,很多商業公司提供了非常成熟的商業產品,使我等可以坐享其成,快速搭建全文搜索的平臺。
ORACLE INTERMEDIA介紹
ORACLE Intermedia是ORACLE公司官方發布的用來管理多媒體數據的數據庫管理模塊,通過它可以進行有效的視頻,音頻,圖片等文件的統一存儲,調用和相關處理;同時其中也包括一個Oracle Intermdedia Text功能模塊,能夠對多種格式文檔進行分詞索引處理,也提供了使用自然語法或高級查詢方法進行跨文本查詢的途徑,可以查詢word, PDF,RTF等格式的文件和數據。
Oracle Intermedia 的索引效率和查詢效率,據一些公開數據上看要遠高于Microsoft的Index Server,而且本身具有平臺無關特性,另外作為數據庫產品,可以很好的和數據庫應用進行整合,這一點也是純粹的文件索引系統所無法實現的。當然,作為通用的數據庫產品,Oracle不可能針對全文索引做到最大限度的優化,因此對于高并發大容量的搜索引擎應用,Oracle的方案可能就無法滿足,這一點也是必須提前聲明的。
全文索引實現步驟
步驟1:查看Oracle Intermedia是否正確安裝。Oracle Intermdeia是Oracle的一個附帶模塊,安裝過程中選擇即可。
步驟2:設置詞法解析器
oracle根據不同語言,有不同的詞法解析器,以下說明我們可能用到的三個
basic_lexer,針對英語環境,以空格為分詞標記,同時能分辨一些“噪音”單詞,如 “if”, “is”等。
chinese_vgram_lexer,專用的漢語分析器,按字為單元分析中文,算法簡單,可以一網打盡中文用詞,但是效率差強人意。
chinese_lexer,可以識別大部分常用短語和詞匯,不會產生大量冗余數據,有很好的實用性,但是語言支持只能為UTF-8編碼,不支持zhs16gbk字符集。
以ctxsys用戶登陸系統,執行:
begin ctx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end;
這里假設我們的語法解析器命名為my_lexer,這個名稱也可以根據實際應用變化。
步驟3:建立索引字段
我的測試用例保存在system空間,表名為my_docs,字段名為doc,字段類型為blob,存儲標準word doc文件。
仍舊保持ctxsys帳戶登陸,執行如下操作
create index system.myindex on system.my_docs(doc) indextype is ctxsys.context parameters(‘lexer’,’my_lexer’) ;
步驟4:同步操作(sync)及優化操作
以system 登陸,同步操作執行
exec ctx_ddl.sync_index('myindex');
創建同步定時任務代碼如下
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');',
SYSDATE, 'SYSDATE + (1/24/4)');
commit;
END;
/
以system登陸,優化索引操作執行
exec ctx_ddl.optimize_index('myindex','FULL');
創建優化定時任務代碼如下
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');',
SYSDATE, 'SYSDATE + 1');
commit;
END;
/
步驟5:測試
select id from my_docs where contains(doc,'關鍵字')>0
總結:
該學習筆記內容大部分可以通過搜索引擎找到,并非本人原創內容,本文全部經個人在windows平臺下,在oracle 9i下測試完成,留檔記錄,為日后的項目和產品開發做技術準備。
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
30 | 31 | 1 | 2 | 3 | 4 | 5 | |||
6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
歡迎探討,努力學習Java哈
常用鏈接
留言簿(3)
隨筆分類
- Java(11)
- JSP
- MyEclipse(1)
- Oracle 10g(3)
- Resin
- Spring
- SQL(4)
- Struts(1)
- Tomcat
- XML(2)
- 個人日志(1)
- 學習(5)
- 工作(1)
- 搜索引擎(7)
- 灌水(1)
- 貼圖
- 軟件工程
隨筆檔案
文章分類
文章檔案
Lansing's Download
Lansing's Link
我的博客
搜索
最新評論

- 1.?re: 關于ODBC數據源連接文本
- 評論內容較長,點擊標題查看
- --棱語明
- 2.?re: Oracle 10g TO_DATE() ora-01830 領悟共勉[未登錄]
- 評論內容較長,點擊標題查看
- --訪客
- 3.?re: Oracle 10g TO_DATE() ora-01830 領悟共勉
- 人才??!
- --歲月無聲
- 4.?re: Struts框架技術在J2EE中的研究和應用[未登錄]
- dfetetgfgf
- --aa
- 5.?re: 關于ODBC數據源連接文本 [未登錄]
-
“坐在巷口的那對男女”呵呵 @blackbat
- --lansing