posts - 40,  comments - 7,  trackbacks - 0
          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)備。
          posted on 2006-08-17 09:33 Lansing 閱讀(1903) 評論(0)  編輯  收藏 所屬分類: Oracle 10g 、搜索引擎

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          歡迎探討,努力學(xué)習(xí)Java哈

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Lansing's Download

          Lansing's Link

          我的博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宾川县| 兴业县| 新蔡县| 玉林市| 罗江县| 奈曼旗| 巴南区| 昌平区| 郯城县| 阳江市| 壤塘县| 綦江县| 南溪县| 平武县| 郯城县| 克东县| 虹口区| 兰西县| 涞源县| 佛教| 湾仔区| 瑞丽市| 淮北市| 十堰市| 友谊县| 新龙县| 嘉定区| 京山县| 班玛县| 铁岭县| 广汉市| 沁源县| 南平市| 独山县| 班戈县| 顺平县| 皮山县| 买车| 临泽县| 湾仔区| 邢台市|