熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

使用OracleText構建全文搜索應用程序

2013-11-13 16:17:01  來源: Oracle 

  Oracle Text 是一種功能強大的搜索技術它內置於 Oracle 數據庫的所有版本(包括免費提供的快捷版 (XE))中它所提供的開發 API 使軟件開發人員能夠輕松實現功能齊備的內容搜索應用程序

  Oracle Text 可用於搜索結構化和非結構化文檔是對 SQL 通配符匹配的補充Oracle Text 支持使用基本的布爾運算符(ANDORNOTNEAR 等)將多個搜索條目組合到一起此外它還具有更高級的功能如 soundex 和模糊搜索以及結果排序等該技術支持數百種文件類型包括 Microsoft Office 和 PDFOracle Text 適合多種與搜索相關的使用情況和存儲結構Text 的應用領域包括電子商務文檔和記錄管理以及問題跟蹤等可檢索的文本可以結構化形式駐留在數據庫中也可以非結構化形式駐留在本地文件系統中或 Web 上

  Oracle Text 提供完整的基於 SQL 的搜索 API該 API 包含自定義查詢運算符DDL 語法擴展一組 PL/SQL 過程和數據庫視圖通過 Text API應用程序開發人員可完全控制索引查詢安全演示以及有時會需要的軟件配置在開發即需即用的非自定義軟件時尤為如此通過即需即用的軟件產品您希望使軟件的配置盡可能簡約即使這意味著要在產品開發中多做一些前期工作也是如此降低應用程序的復雜性通常會在產品生命周期的後期尤其是在支持維護和未來產品開發階段中見到成效

  Oracle Text 還支持文檔級授權而文檔級授權通常很難在統一的同時保持高性能借助 Text組合了關系數據與非結構化數據的混和查詢也得到了很好的支持對於授權這意味著您可以將全文搜索和授權合並到一個查詢中獨立結果集和獲得最終結果所需的過濾階段的數量可最大程度地縮減從而簡化了應用程序的開發Oracle Text 使應用程序開發人員從繁瑣的開發中解脫出來可以集中精力進行性能優化

  Oracle Text 也是編程語言不可知的並且也可以同樣卓越的表現為 PHP 以及 Java 應用程序工作

  前一段時間我需要提高企業內容管理 (ECM) 系統的搜索功能我首先對 Oracle Text 的使用進行了評估評估證明 Oracle Text 是一種構建應用程序搜索非常可行的技術它具有高級搜索功能支持大量不同的文件類型可高度自定義同時高度可伸縮原有搜索技術的一個缺點是您需要在數據庫外部運行文件內容搜索然後運行數據庫元數據搜索對結果進行授權最後合並獨立的結果集使用 Oracle Text所有這些操作都可以在數據庫中進行ECM 系統已經使用 Oracle 數據庫來存儲元數據因為此項技術已經推出因此客戶自然會選擇使用而且它也不會給客戶增加任何成本

  在數據庫中執行自由文本搜索查詢的簡單方法類似於

     SELECT * FROM issues
  WHERE LOWER(author) LIKE %word% AND LOWER(author) LIKE %word% 

  使用這種方法每一列都需要與每個關鍵字單獨進行匹配在每一列中可以任何順序與關鍵字進行匹配然而關系數據庫的設計使得它不會像上面那樣有效地執行查詢而且使用這種方法會產生極其不可伸縮的應用程序當然您可以設計自己的索引和搜索解決方案但是那樣您可能不會優化使用您的資源在您已經為將搜索技術作為數據庫的一部分付出了成本的情況下尤為如此

  本文討論 Oracle Text 在虛擬的問題跟蹤應用程序中的使用在這個應用程序中用戶可以創建一些包含元數據和可選附加文件的問題該應用程序利用 Oracle Text 實現元數據和可選附加文件內容的全文搜索功能

  此處給出的示例已經在 Linux 的 Oracle 數據庫 XE 上進行了測試這些示例應該同樣也可在其他 Oracle 平台上運行良好

  索引進程與搜索

  Oracle Text 為可檢索的數據項建立索引之後用戶才能夠通過搜索查找內容編制索引是確保搜索性能的常用方法Oracle Text 的索引進程是根據管道建模的在這個管道中從數據存儲檢索來的數據項經過一系列轉換之後其關鍵字會添加到索引中該索引進程分為多個階段每個階段都由一個單獨的實體來處理並可由應用程序開發人員來配置

  Oracle Text 具有適合不同用途的不同索引類型對於大型文檔的全文搜索適合使用 CONTEXT 索引類型該索引進程包括以下幾個階段


  數據檢索只是將數據從數據存儲(例如 Web 頁面數據庫大型對象或本地文件系統)中取出然後作為數據流傳送到下一個階段
  過濾過濾器負責將各種文件格式的數據轉換為純文本格式索引管道中的其他組件只能處理純文本數據不能識別 Microsoft Word 或 Excel 等文件格式
  分段分段器添加關於原始數據項結構的元數據
  詞法分析根據數據項的語言將字符流分為幾個字詞
  索引最後一個階段將關鍵字添加到實際索引中

  索引構建完成後應用程序即可通過普通的 SQL 查詢執行最終用戶輸入的搜索

  安裝 Oracle Text

  在默認情況下Oracle Text 隨 Oracle 數據庫 XE 一起安裝如何使用的是其他數據庫版本您需要自己安裝 Oracle Text 功能安裝了此功能後您只需創建一個普通的數據庫用戶並賦予該用戶 CTXAPP 角色這樣用戶即可執行特定的索引管理過程

     CREATE USER ot IDENTIFIED BY ot;
  GRANT connectresource ctxapp TO ot;

  文件索引

  此處您要創建一個文本表用於為存儲在問題跟蹤系統中的附加文件內容建立索引附加文件存儲在文件系統中除了應用程序的數據模型所需的列之外文本基表還包括一個絕對文件路徑和一個格式列


     CREATE TABLE files (
  id NUMBER PRIMARY KEY
  issue_id NUMBER
  path VARCHAR() UNIQUE
  ot_format VARCHAR()
  );
  INSERT INTO files VALUES (  /tmp/oracletext/foundtxt NULL);
  INSERT INTO files VALUES (  /tmp/oracletext/founddoc NULL);
  INSERT INTO files VALUES (  /tmp/oracletext/notfoundtxt IGNORE);

  此處 ot_format 的值是 Oracle Text 在索引過程中解析出來的NULL 值表明系統會為文件自動選擇一個過濾器而如果值為 IGNORE系統會跳過整個文件

  可以使用以下語句創建文本索引

     CREATE INDEX file_index ON files(path) INDEXTYPE IS ntext
  PARAMETERS (datastore ctxsysfile_datastore format column ot_format);

  該語句將啟動索引進程索引進程將通過存儲在基表中的路徑在文件系統中檢索文件然後對內容進行過濾並建立索引這樣便創建了一個區分大小寫並具有精確匹配語義的 CONTEXT 索引該索引進程可以多種方式進行自定義例如支持前綴和後綴匹配

  雖然大部分時間過濾階段無需為每個文件指定文件格式即可很好地運行但是在基表中添加這一列可以對索引進程進行進一步控制例如使用格式列您可以跳過某些文件類型不為其建立索引當您只想正式支持應用程序中 Oracle Text 所支持的部分文件格式時這一列非常有用

  Oracle Text 還可用於元數據的全文搜索在示例應用程序中有一個名為 issues 用於存儲問題元數據的表該表的定義如下

     CREATE TABLE issues (
  id NUMBER
  summary VARCHAR()
  description CLOB
  author VARCHAR()
  ot_version VARCHAR()
  );

  ot_version 列為索引列可用於強制為特定文檔重新建立索引該表可使用測試數據填充

     INSERT INTO issues VALUES ( Jane Text does not make tea
  Oracle Text is unable to make morning tea );
  INSERT INTO issues VALUES ( John It comes in the wrong color
  I want to have Text in pink );

  用戶索引

  Oracle Text 可為來自不同數據源的數據建立索引Oracle Text 可用於問題跟蹤系統提供對問題元數據的全文搜索在默認情況下您可為單個列中的值建立索引但是如果要合並多個表的數據您需要創建一個自定義的 PL/SQL 過濾器過程我將演示如何創建這樣的過程這個過程將起到存儲抽象的作用然後該索引進程將迭代文本表中所有的行為每一行調用過濾器過程過濾器過程將返回所有與問題相關的有待建立索引的文本

      declare indexing procedure
  CREATE PACKAGE ot_search AS
  PROCEDURE issue_filter(rid IN ROWID tlob IN OUT NOCOPY CLOB);
  END ot_search;
  /
   define indexing procedure
  CREATE PACKAGE BODY ot_search AS
  PROCEDURE issue_filter(rid IN ROWID tlob IN OUT NOCOPY CLOB) IS
  BEGIN
  FOR c IN (SELECT author summary description FROM issues WHERE rowid = rid)
  LOOP
  dbms_lobwriteappend(tlob LENGTH(csummary)+ csummary ||  );
  dbms_lobwriteappend(tlob LENGTH(cauthor)+ cauthor ||  );
  dbms_lobwriteappend(tlob LENGTH(cdescription) cdescription);
  END LOOP;
  END issue_filter;
  END ot_search;
  /
   define datastore preference for issues
  BEGIN
  ctx_ddlcreate_preference(issue_store user_datastore);
  ctx_ddlset_attribute(issue_store procedure ot_searchissue_filter);
  ctx_ddlset_attribute(issue_store output_type CLOB);
  END;
  /
   index issues
  CREATE INDEX issue_index ON issues(ot_version) INDEXTYPE IS ntext
  PARAMETERS (datastore issue_store);

  搜索

  CONTAINS 運算符用於搜索 CONTEXT 索引雖然 CONTAINS 運算符語法的確支持 soundex 匹配等更高級的功能但在這些示例中我們只用了簡單的布爾運算符來合並關鍵字對於 Oracle Text 支持的語言模糊匹配和詞根還原都是默認啟用的要利用這些高級搜索功能只需將 fuzzy() 或 $ 查詢運算符分別與 CONTAINS 運算符結合使用即可通配符字符可用於前綴和後綴匹配的 CONTAINS 查詢下面是一些簡單的查詢示例


     SELECT id FROM issues WHERE CONTAINS(ot_version color AND pink ) > ;
  SELECT id FROM issues WHERE CONTAINS(ot_version jane OR john ) > ;

  索引維護

  由於基表數據是由索引復制的因此這些數據需要定期與索引進行同步在 CTX_DDL PL/SQL 程序包中可以發現索引維護過程下面給出了一個示例顯示如何更新索引以反映基表更改

     EXECUTE ctx_ddlsync_index(issue_index M);

  該同步過程為操作提供了索引名稱和使用的內存量也可以讓數據庫定期自動執行此項任務您也可以選擇使用操作系統或其他計劃工具來啟動同步例如在 Unix 系統上可安排以下 shell 腳本與 Cron 作業使系統按計劃執行同步

     #!/bin/sh
  export ORACLE_SID=orcl
  export ORAENV_ASK=NO
  source /usr/local/bin/oraenv
  sqlplus ot/ot@XE > synchlog < 
  WHENEVER SQLERROR EXIT ;
  EXECUTE ctx_ddlsync_index(issue_index M);
  EOF

  CTX_DDL 程序包還包含其他有用的過程例如索引優化用於消除索引碎片和清除過期的數據

  如果出現錯誤可通過 CTX_USER_INDEX_ERRORS 視圖跟蹤索引錯誤

  數據庫根據索引列更改跟蹤文檔的變更因此如果您希望強制 Oracle Text 重新為某些文檔建立索引可以更新相應行的索引列如下所示

     UPDATE files SET path=path WHERE id = ;

  這將在同步索引時更新 id 為 的文件的索引關鍵字


From:http://tw.wingwit.com/Article/program/Oracle/201311/18082.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.