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

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