Oracle Text 是一種功能強大的搜索技術,它內置於 Oracle 數據庫的所有版本(包括免費提供的快捷版 (XE))中。它所提供的開發 API 使軟件開發人員能夠輕松實現功能齊備的內容搜索應用程序。
Oracle Text 可用於搜索結構化和非結構化文檔,是對 SQL 通配符匹配的補充。Oracle Text 支持使用基本的布爾運算符(AND、OR、NOT、NEAR 等)將多個搜索條目組合到一起,此外,它還具有更高級的功能,如 soundex 和模糊搜索,以及結果排序等。該技術支持數百種文件類型,包括 Microsoft Office 和 PDF。Oracle 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 '%word1%' AND LOWER(author) LIKE '%word2%' ...
使用這種方法,每一列都需要與每個關鍵字單獨進行匹配。在每一列中,可以任何順序與關鍵字進行匹配。然而,關系數據庫的設計使得它不會像上面那樣有效地執行查詢,而且使用這種方法會產生極其不可伸縮的應用程序。當然,您可以設計自己的索引和搜索解決方案,但是,那樣您可能不會優化使用您的資源,在您已經為將搜索技術作為數據庫的一部分付出了成本的情況下尤為如此。
本文討論 Oracle Text 在虛擬的問題跟蹤應用程序中的使用。在這個應用程序中,用戶可以創建一些包含元數據和可選附加文件的問題。該應用程序利用 Oracle Text 實現元數據和可選附加文件內容的全文搜索功能。
此處給出的示例已經在 Linux 的 Oracle 數據庫 XE 上進行了測試,這些示例應該同樣也可在其他 Oracle 平台上運行良好。
索引進程與搜索
Oracle Text 為可檢索的數據項建立索引之後,用戶才能夠通過搜索查找內容。編制索引是確保搜索性能的常用方法。Oracle Text 的索引進程是根據管道建模的,在這個管道中,從數據存儲檢索來的數據項經過一系列轉換之後,其關鍵字會添加到索引中。該索引進程分為多個階段,每個階段都由一個單獨的實體來處理,並可由應用程序開發人員來配置。
Oracle Text 具有適合不同用途的不同索引類型。對於大型文檔的全文搜索,適合使用 CONTEXT 索引類型。該索引進程包括以下幾個階段:
索引構建完成後,應用程序即可通過普通的 SQL 查詢執行最終用戶輸入的搜索。
安裝 Oracle Text
在默認情況下,Oracle Text 隨 Oracle 數據庫 XE 一起安裝。如何使用的是其他數據庫版本,您需要自己安裝 Oracle Text 功能。安裝了此功能後,您只需創建一個普通的數據庫用戶,並賦予該用戶 CTXAPP 角色。這樣,用戶即可執行特定的索引管理過程:
CREATE USER ot1 IDENTIFIED BY ot1;
GRANT connect,resource, ctxapp TO ot1;