全文檢索技術是智能信息管理的關鍵技術之一Oracle Text作為Oraclei的一個組件提供了強大的全文檢索功能用Oraclei做後台數據庫就可以充分利用其全文檢索技術構建復雜的大型文檔管理系統本文主要介紹了Oracle Text的體系結構及其使用
Oracle一直致力於全文檢索技術的研究當Oraclei Rlease發布之時Oracle數據庫的全文檢索技術已經非常完美Oracle Text使Oraclei具備了強大的文本檢索能力和智能化的文本管理能力Oracle Text是Oraclei采用的新名稱在Oracle/i中它被稱作Oracle interMedia Text在Oracle以前它的名稱是Oracle ConText Cartridge使用Oraclei和Oracle Text可以方便而有效地利用標准的SQL工具來構建基於文本的新的開發工具或對現有應用程序進行擴展應用程序開發人員可以在任何使用文本的Oracle數據庫應用程序中充分利用Oracle Text搜索應用范圍可以是現有應用程序中可搜索的注釋字段也可是實現涉及多種文檔格式和復雜搜索標准的大型文檔管理系統Oracle Text支持Oracle數據庫所支持的大多數語言的基本全文搜索功能本文將介紹如何使用Oraclei的全文檢索技術來為自己的應用提供一個優秀的解決方案
Oracle Text的體系架構
Oracle Text 索引文檔時所使用的主要邏輯步驟如下
()數據存儲邏輯搜索表的所有行並讀取列中的數據通常這只是列數據但有些數據存儲使用列數據作為文檔數據的指針例如URL_DATASTORE 將列數據作為 URL 使用
()過濾器提取文檔數據並將其轉換為文本表示方式存儲二進制文檔 (如 Word 或 Acrobat 文件) 時需要這樣做過濾器的輸出不必是純文本格式 —— 它可以是 XML 或 HTML 之類的文本格式
()分段器提取過濾器的輸出信息並將其轉換為純文本包括 XML 和 HTML 在內的不同文本格式有不同的分段器轉換為純文本涉及檢測重要文檔段標記移去不可見的信息和文本重新格式化
()詞法分析器提取分段器中的純文本並將其拆分為不連續的標記既存在空白字符分隔語言使用的詞法分析器也存在分段復雜的亞洲語言使用的專門詞法分析器
()索引引擎提取詞法分析器中的所有標記文檔段在分段器中的偏移量以及被稱為非索引字的低信息含量字列表並構建反向索引倒排索引存儲標記和含有這些標記的文檔
簡單的示例
這裡先給出一個簡單示例說利用Oracle Text實現全文檢索的方法與步驟在後面在進行具體的說明Orcalei提供了Oracle Text Manager可以簡化許多工作所有在Oracle Text Manager中完成的工作都可以在通過PL/SQL來實現要使用Oracle Text必須具有CTXAPP角色或者是CTXSYS用戶Oracle Text為系統管理員提供CTXSYS用戶為應用程序開發人員提供CTXAPP角色
CTXSYS用戶可執行以下任務啟動Oracle Text服務器執行CTXAPP角色的所有任務
具有CTXAPP角色的用戶可執行以下任務 創建索引管理 Oracle Text 數據字典包括創建和刪除首選項進行Oracle Text 查詢使用 Oracle Text PL/SQL程序包
使用Oracle Text的步驟
()創建表來保存某些文檔該示例使用一個主關鍵字列來標識每個文檔使用一個小的VARCHAR列來保存每個文檔
CREATE TABLE docs (id NUMBER PRIMARY KEY text VACHAR());
()將兩個示例文檔置入該表
INSERT INTO docs VALUES (the first doc)
INSERT INTO docs VALUES (the second doc)
COMMIT
()使用Oracle Text Manager來創建和修改首選項首選項將與索引相關聯
()使用Oracle Text Manager創建文本索引另外可以輸入以下使用默認首選項的 SQL 語句
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYSCONTEXT;
()使用 CONTAINS 函數發出基於內容的文檔查詢例如
SELECT id FROM docs WHERE CONTAINS (text first) > ;
這將在文本列包含單詞 first (即文檔) 的 docs 中查找所有行語句中的>部分是有效的Oracle SQL所必需的Oracle SQL不支持函數的布爾返回值
以上只是一個簡單的示例旨在給出使用Oracle Text建立全文索引的完整步驟歸納起來如下
()建表並裝載文本(包含帶有需要檢索的文本字段)
()配置索引
()建立索引
()發出查詢
()索引維護同步與優化(將在後面介紹)
文本裝載
要實現文本的全文檢索首先必須把正確的文本加載到數據庫表中默認的建立索引行為要求將文檔裝載在文本列中盡管可以用其它方式 (包括文件系統和 URL 形式)存儲文檔 (在數據存儲選項進行設置)默認情況下系統應該將文檔裝載在文本列中文本列可以是VARCHARCLOBBLOBCHAR或BFILE注意只有在將Oracle系統移植到Oracle的情況下才支持用LONG和LONG RAW 這兩個相反的列類型存儲文本不能為列類型NCLOBDATE和NUMBER建立索引
關於文檔格式因為系統能為包括HTMLPDFMicrosoft Word和純文本在內的大多數文檔格式建立索引可以將其中的任何文檔類型裝載到文本列中(在過濾器選項中設置)有關所支持的文檔格式的詳細信息可以參閱Oracle Text Users Guide and Reference 中的附錄Supported Filter Formats
裝載方法主要有以下幾種
()SQL INSERT 語句
()ctxload 可執行文件
()SQL*Loader
()從 BFILE 中裝載 LOB 的 DBMS_LOBLOADFROMFILE() PL/SQL 過程
()Oracle Call Interface
為文本建立索引
文本裝入文本列後就可以創建Oracle Text索引文檔以許多不同方案格式和語言存儲因此每個 Oracle Text 索引有許多需要設置的選項以針對特定情況配置索引創建索引時Oracle Text可使用若干個默認值但在大多數情況下要求用戶通過指定首選項來配置索引
每個索引的許多選項組成功能組稱為類&quo
每個類集中體現配置的某一方面可以認為這些類就是與文檔數據庫有關的一些問題例如數據存儲過濾器詞法分析器相關詞表存儲等
每個類具有許多預定義的行為稱之為對象每個對象是類問題可能具有的答案並且大多數對象都包含有屬性通過屬性來定制對象從而使對索引的配置更加多變以適應於不同的應用
()存儲(Storage)類
存儲類指定構成Oracle Text索引的數據庫表和索引的表空間參數和創建參數它僅有一個基本對象BASIC_STORAGE其屬性包括I_Index_ClauseI_Table_ClauseK_Table_ClauseN_Table_ClauseP_Table_ClauseR_Table_Clause
()數據存儲(Datastore)類
數據存儲關於列中存儲文本的位置和其他信息默認情況下文本直接存儲到列中表中的每行都表示一個單獨的完整文檔其他數據存儲位置包括存儲在單獨文件中或以其 URL 標識的 Web 頁上七個基本對象包括Default_DatastoreDetail_DatastoreDirect_DatastoreFile_DatastoreMulti_Column_Datastore URL_DatastoreUser_Datastore
()文檔段組(Section Group)類
文檔段組是用於指定一組文檔段的對象必須先定義文檔段然後才能使用索引通過 WITHIN 運算符在文檔段內進行查詢文檔段定義為文檔段組的一部分包含七個基本對象AUTO_SECTION_GROUPBASIC_SECTION_GROUPHTML_SECTION_GROUPNEWS_SECTION_GROUPNULL_SECTION_GROUPXML_SECTION_GROUPPATH_SECTION_GROUP
()相關詞表(Wordlist)類
相關詞表標識用於索引的詞干和模糊匹配查詢選項的語言只有一個基本對象BASIC_WORDLIST其屬性有Fuzzy_MatchFuzzy_NumresultsFuzzy_ScoreStemmerSubstring_IndexWildcard_MaxtermsPrefix_IndexPrefix_Max_LengthPrefix_Min_Length
()索引集(Index Set)
索引集是一個或多個Oracle 索引 (不是Oracle Text索引) 的集合用於創建 CTXCAT類型的Oracle Text索引只有一個基本對象BASIC_INDEX_SET
()詞法分析器(Lexer)類
詞法分析器類標識文本使用的語言還確定在文本中如何標識標記默認的詞法分析器是英語或其他西歐語言用空格標准標點和非字母數字字符標識標記同時禁用大小寫包含個基本對象BASIC_LEXERCHINESE_LEXERCHINESE_VGRAM_LEXERJAPANESE_LEXERJAPANESE_VGRAM_LEXERKOREAN_LEXERKOREAN__MORPH_ LEXERMULTI_LEXER
()過濾器(Filter)類
過濾器確定如何過濾文本以建立索引可以使用過濾器對文字處理器處理的文檔格式化的文檔純文本和 HTML 文檔建立索引包括個基本對象CHARSET_FILTERINSO_FILTER INSONULL_FILTERPROCEDURE_FILTERUSER_FILTER
()非索引字表(Stoplist)類
非索引字表類是用以指定一組不編入索引的單詞 (稱為非索引字)有兩個基本對象BASIC_STOPLIST (一種語言中的所有非索引字) MULTI_STOPLIST (包含多種語言中的非索引字的多語言非索引字表)
查詢
建立了索引就可以使用 SELECT 語句中的 CONTAINS 運算符發出文本查詢使用 CONTAINS 可以進行兩種查詢單詞查詢和ABOUT查詢
詞查詢示例
詞查詢是對輸入到 CONTAINS 運算符中單引號間的精確單詞或短語的查詢在以下示例中我們將查找文本列中包含 oracle 一詞的所有文檔每行的分值由使用標簽 的 SCORE 運算符選定
SELECT SCORE() title from news WHERE CONTAINS(text oracle ) >
在查詢表達式中可以使用 AND 和 OR 等文本運算符來獲取不同結果還可以將結構性謂詞添加到 WHERE 子句中可以使用 count(*)CTX_QUERYCOUNT_HITS 或 CTX_QUERYEXPLAIN 來計算查詢的命中 (匹配) 數目
ABOUT查詢示例
在所有語言中ABOUT查詢增加了某查詢所返回的相關文檔的數目在英語中ABOUT 查詢可以使用索引的主題詞組件該組件在默認情況下創建這樣運算符將根據查詢的概念返回文檔而不是僅依據所指定的精確單詞或短語例如以下查詢將查找文本列中關於主題 politics 的所有文檔而不是僅包含 politics 一詞的文檔
SELECT SCORE() title from news WHERE CONTAINS(text about(politics) ) >
顯示滿足查詢條件的文檔
通常通過使用Oracle Text查詢應用程序用戶可查看查詢所返回的文檔用戶從命中列表中選擇一個文檔然後應用程序以某種形式顯示該文檔通過Oracle Text可以用不同的方式再現文檔例如可以通過突出顯示查詢詞來顯示文檔突出顯示的查詢詞可以是相關詞查詢中的詞也可以是英文 ABOUT 查詢中的主題詞
以下是關於輸出效果和用於每個輸出效果的過程的信息
突出顯示的文檔純文本格式版本(CTX_DOCMARKUP)
突出顯示的文檔HTML版本(CTX_DOCMARKUP)
突出顯示純文本格式版本的偏移量信息(CTX_DOCHIGHLIGHT)
突出顯示HTML 版本的偏移量信息(CTX_DOCHIGHLIGHT)
純文本格式版本無突出顯示(CTX_DOCFILTER)
HTML版本文檔無突出顯示(CTX_DOCFILTER)
索引維護
索引建好後如果表中的數據發生變化比如增加或修改了記錄怎麼辦?由於對表所發生的任何DML語句都不會自動修改索引因此必須定時同步(sync)和優化(optimize)索引以正確反映數據的變化
在索引建好後可以在該用戶下查到Oracle自動產生了以下幾個表(假設索引名為myindex)
DR$myindex$IDR$myindex$KDR$myindex$RDR$myindex$N
其中以I表最重要可以查詢一下該表
select token_text token_count from DR$ myindex $I where rownum<=
查詢結果在此省略可以看到該表中保存的其實就是Oracle 分析你的文檔後生成的term記錄
在這裡包括term出現的位置次數hash值等當文檔的內容改變後可以想見這個I表的內容也應該相應改變才能保證Oracle在做全文檢索時正確檢索到內容(因為所謂全文檢索其實核心就是查詢這個表)那麼如何維護該表的內容不能每次數據改變都重新建立索引這就要用到sync 和 optimize了
同步(sync)將新的term 保存到I表
優化(optimize)清除I表的垃圾主要是將已經被刪除的term從I表刪除
Oracle提供了一個所謂的ctx server來做這個同步和優化的工作只需要在後台運行這個進程它會監視數據的變化及時進行同步另外也可以用以下的job來完成(該job要建在和表同一個用戶下)
create or replace procedure sync
is
begin
execute immediate
alter index myindex rebuild online ||
parameters ( sync ) ;
execute immediate
alter index myindex rebuild online ||
parameters ( optimize full maxtime unlimited ) ;
end sync;
/
Set ServerOutput on
declare
v_job number;
begin
Dbms_JobSubmit
(
job => v_job
what => sync;
next_date => sysdate /* default */
interval => sysdate + / /* = day
/ ( hrs * min) = mins */
);
Dbms_JobRun ( v_job );
Dbms_OutputPut_Line
( Submitted as job # || to_char ( v_job ) );
end;
/
job的SYSDATE + (/)是指每隔分鐘同步一次具體的時間間隔可以根據自己的應用的需要而定
總結
文本對於各種規模的公司機構組織來說都是包含眾多豐富信息的最有效載體Oracle Text的推出標志著Oracle提供了一套嶄新的技術可以便捷安全的用於管理企業的文本信息Oracle Text使應用程序開發者可以透明地將全文檢索能力加入到基於SQL的應用程序中Oracle Text也是其他Oracle產品的核心組件比如OracleiAS PortalOracle eBusiness SuiteOracle Ultra Search和Oracle Internet File System等靈活運用Oracle Text提供的全文檢索技術就可以使自己的應用具備強大的全文檢索能力
From:http://tw.wingwit.com/Article/program/Oracle/201311/16601.html