posts - 40,  comments - 7,  trackbacks - 0
          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下測試完成,留檔記錄,為日后的項目和產品開發做技術準備。
          posted on 2006-08-17 09:33 Lansing 閱讀(1896) 評論(0)  編輯  收藏 所屬分類: Oracle 10g搜索引擎
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          歡迎探討,努力學習Java哈

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Lansing's Download

          Lansing's Link

          我的博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 即墨市| 南宁市| 中山市| 闸北区| 财经| 太仓市| 万年县| 徐闻县| 莱芜市| 湖南省| 株洲县| 鄂伦春自治旗| 临高县| 新丰县| 额尔古纳市| 樟树市| 陇南市| 平乐县| 宁城县| 米林县| 靖江市| 金阳县| 平遥县| 安达市| 拜城县| 长治市| 舒兰市| 兴国县| 揭东县| 河西区| 滨州市| 沂南县| 许昌市| 白河县| 黄陵县| 垫江县| 阳西县| 滕州市| 沈阳市| 巴楚县| 奉节县|