国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

使用Oracle Text構建全文搜索應用程序

2024-08-29 13:33:40
字體:
來源:轉載
供稿:網友
  Oracle Text 是一種功能強大的搜索技術,它內置于 Oracle 數據庫的所有版本(包括免費提供的快捷版 (XE))中。它所提供的開發 API 使軟件開發人員能夠輕松實現功能齊備的內容搜索應用程序。   Oracle Text 可用于搜索結構化和非結構化文檔,是對 SQL 通配符匹配的補充。Oracle Text 支持使用基本的布爾運算符(AND、OR、NOT、NEAR 等)將多個搜索條目組合到一起,此外,它還具有更高級的功能,如 soundex 和模糊搜索,以及結果排序等。該技術支持數百種文件類型,包括 Microsoft Office 和 PDF。Oracle Text 適合多種與搜索相關的使用情況和存儲結構。Text 的應用領域包括電子商務、文檔和記錄治理,以及問題跟蹤等??蓹z索的文本可以結構化形式駐留在數據庫中,也可以非結構化形式駐留在本地文件系統中或 Web 上。  Oracle Text 提供完整的基于 SQL 的搜索 API,該 API 包含自定義查詢運算符、DDL 語法擴展、一組 PL/SQL 過程和數據庫視圖。通過 Text API,應用程序開發人員可完全控制索引、查詢、安全、演示以及有時會需要的軟件配置,在開發即需即用的非自定義軟件時尤為如此。通過即需即用的軟件產品,您希望使軟件的配置盡可能簡約,即使這意味著要在產品開發中多做一些前期工作也是如此。降低應用程序的復雜性通常會在產品生命周期的后期,尤其是在支持、維護和未來產品開發階段中見到成效?! racle Text 還支持文檔級授權,而文檔級授權通常很難在統一的同時保持高性能。借助 Text,組合了關系數據與非結構化數據的混和查詢也得到了很好的支持。對于授權,這意味著您可以將全文搜索和授權合并到一個查詢中。獨立結果集和獲得最終結果所需的過濾階段的數量可最大程度地縮減,從而簡化了應用程序的開發。Oracle Text 使應用程序開發人員從繁瑣的開發中解脫出來,可以集中精力進行性能優化?! racle Text 也是編程語言不可知的,并且也可以同樣卓越的表現為 php 以及 java 應用程序工作?! ∏耙欢螘r間,我需要提高企業內容治理 (ECM) 系統的搜索功能。我首先對 Oracle Text 的使用進行了評估。評估證實 Oracle Text 是一種構建應用程序搜索非??尚械募夹g:它具有高級搜索功能,支持大量不同的文件類型,可高度自定義,同時高度可伸縮。原有搜索技術的一個缺點是,您需要在數據庫外部運行文件內容搜索,然后運行數據庫元數據搜索,對結果進行授權,最后,合并獨立的結果集。使用 Oracle Text,所有這些操作都可以在數據庫中進行。ECM 系統已經使用 Oracle 數據庫來存儲元數據。因為此項技術已經推出,因此客戶自然會選擇使用,而且它也不會給客戶增加任何成本?! ≡跀祿熘袌绦凶杂晌谋舅阉鞑樵兊暮唵畏椒愃朴冢骸 ELECT * 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 索引類型。該索引進程包括以下幾個階段:
  •   數據檢索:只是將數據從數據存儲(例如 Web 頁面、數據庫大型對象或本地文件系統)中取出,然后作為數據流傳送到下一個階段。
  •   過濾:過濾器負責將各種文件格式的數據轉換為純文本格式。索引管道中的其他組件只能處理純文本數據,不能識別 Microsoft Word 或 Excel 等文件格式。
  •   分段:分段器添加關于原始數據項結構的元數據。
  •   詞法分析:根據數據項的語言將字符流分為幾個字詞。
  •   索引:最后一個階段將要害字添加到實際索引中。
  索引構建完成后,應用程序即可通過普通的 SQL 查詢執行最終用戶輸入的搜索?! ?STRONG>安裝 Oracle Text  在默認情況下,Oracle Text 隨 Oracle 數據庫 XE 一起安裝。如何使用的是其他數據庫版本,您需要自己安裝 Oracle Text 功能。安裝了此功能后,您只需創建一個普通的數據庫用戶,并賦予該用戶 CTXAPP 角色。這樣,用戶即可執行特定的索引治理過程:  CREATE USER ot1 IDENTIFIED BY ot1;
  GRANT connect,resource, ctxapp TO ot1;   文件索引  此處,您要創建一個文本表,用于為存儲在問題跟蹤系統中的附加文件內容建立索引。附加文件存儲在文件系統中。除了應用程序的數據模型所需的列之外,文本基表還包括一個絕對文件路徑和一個格式列。
  CREATE TABLE files (
  id NUMBER PRIMARY KEY,
  issue_id NUMBER,
  path VARCHAR(255) UNIQUE,
  ot_format VARCHAR(6)
  );
  INSERT INTO files VALUES (1, 1, '/tmp/oracletext/found1.txt', NULL);
  INSERT INTO files VALUES (2, 2, '/tmp/oracletext/found2.doc', NULL);
  INSERT INTO files VALUES (3, 2, '/tmp/oracletext/notfound.txt', 'IGNORE');  此處 ot_format 的值是 Oracle Text 在索引過程中解析出來的。NULL 值表明系統會為文件自動選擇一個過濾器,而假如值為 IGNORE,系統會跳過整個文件。  可以使用以下語句創建文本索引:  CREATE INDEX file_index ON files(path) INDEXTYPE IS ctxsys.context
  PARAMETERS ('datastore ctxsys.file_datastore format column ot_format');  該語句將啟動索引進程,索引進程將通過存儲在基表中的路徑在文件系統中檢索文件,然后對內容進行過濾并建立索引。這樣便創建了一個區分大小寫并具有精確匹配語義的 CONTEXT 索引。該索引進程可以多種方式進行自定義,例如支持前綴和后綴匹配?! ‰m然大部分時間過濾階段無需為每個文件指定文件格式即可很好地運行,但是,在基表中添加這一列可以對索引進程進行進一步控制。例如,使用格式列,您可以跳過某些文件類型不為其建立索引。當您只想正式支持應用程序中 Oracle Text 所支持的部分文件格式時,這一列非常有用?! racle Text 還可用于元數據的全文搜索。在示例應用程序中,有一個名為 issues 用于存儲問題元數據的表。該表的定義如下:  CREATE TABLE issues (
  id NUMBER,
  summary VARCHAR(120),
  description CLOB,
  author VARCHAR(80),
  ot_version VARCHAR(10)
  );  ot_version 列為索引列,可用于強制為特定文檔重新建立索引。該表可使用測試數據填充:
  INSERT INTO issues VALUES (1, 'Jane', 'Text does not make tea',
  'Oracle Text is unable to make morning tea', 1);
  INSERT INTO issues VALUES (2, 'John', 'It comes in the wrong color',
  'I want to have Text in pink', 1);  用戶索引  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 c1 IN (SELECT author, summary, description FROM issues WHERE rowid = rid)
  LOOP
  dbms_lob.writeappend(tlob, LENGTH(c1.summary)+1, c1.summary  ' ');
  dbms_lob.writeappend(tlob, LENGTH(c1.author)+1, c1.author  ' ');
  dbms_lob.writeappend(tlob, LENGTH(c1.description), c1.description);
  END LOOP;
  END issue_filter;
  END ot_search;
  /
  -- define datastore preference for issues
  BEGIN
  ctx_ddl.create_preference('issue_store', 'user_datastore');
  ctx_ddl.set_attribute('issue_store', 'procedure', 'ot_search.issue_filter');
  ctx_ddl.set_attribute('issue_store', 'output_type', 'CLOB');
  END;
  /
  -- index issues
  CREATE INDEX issue_index ON issues(ot_version) INDEXTYPE IS ctxsys.context
  PARAMETERS ('datastore issue_store');   搜索  CONTAINS 運算符用于搜索 CONTEXT 索引。雖然 CONTAINS 運算符語法的確支持 soundex 匹配等更高級的功能,但在這些示例中,我們只用了簡單的布爾運算符來合并要害字。對于 Oracle Text 支持的語言,模糊匹配和詞根還原都是默認啟用的。要利用這些高級搜索功能,只需將 fuzzy() 或 $ 查詢運算符分別與 CONTAINS 運算符結合使用即可。通配符字符可用于前綴和后綴匹配的 CONTAINS 查詢。下面是一些簡單的查詢示例:
  SELECT id FROM issues WHERE CONTAINS(ot_version, 'color AND pink', 1) > 0;
  SELECT id FROM issues WHERE CONTAINS(ot_version, 'jane OR john', 1) > 0;  索引維護  由于基表數據是由索引復制的,因此這些數據需要定期與索引進行同步。在 CTX_DDL PL/SQL 程序包中可以發現索引維護過程。下面給出了一個示例,顯示如何更新索引以反映基表更改:
  EXECUTE ctx_ddl.sync_index('issue_index', '2M');  該同步過程為操作提供了索引名稱和使用的內存量。也可以讓數據庫定期自動執行此項任務。您也可以選擇使用操作系統或其他計劃工具來啟動同步。例如,在 Unix 系統上,可安排以下 shell 腳本與 Cron 作業,使系統按計劃執行同步:  #!/bin/sh
  eXPort ORACLE_SID=orcl
  export ORAENV_ASK=NO
  source /usr/local/bin/oraenv
  sqlplus ot1/ot1@XE > synch.log < 
  WHENEVER SQLERROR EXIT 5;
  EXECUTE ctx_ddl.sync_index('issue_index', '2M');
  EOF  CTX_DDL 程序包還包含其他有用的過程,例如索引優化,用于消除索引碎片和清除過期的數據?! 〖偃绯霈F錯誤,可通過 CTX_USER_INDEX_ERRORS 視圖跟蹤索引錯誤?! 祿旄鶕饕懈母櫸臋n的變更,因此,假如您希望強制 Oracle Text 重新為某些文檔建立索引,可以更新相應行的索引列,如下所示:  UPDATE files SET path=path WHERE id = 4;  這將在同步索引時更新 id 為 4 的文件的索引要害字。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁德市| 宽城| 德钦县| 南岸区| 宁陵县| 砚山县| 临城县| 碌曲县| 元阳县| 新余市| 潍坊市| 孝感市| 盘山县| 溧水县| 永春县| 昌都县| 永平县| 读书| 缙云县| 罗山县| 噶尔县| 新建县| 景德镇市| 邓州市| 云和县| 罗平县| 金堂县| 延吉市| 饶阳县| 喀喇| 新建县| 略阳县| 安岳县| 德令哈市| 清新县| 东源县| 太康县| 四子王旗| 北京市| 宿迁市| 黔西县|