正在看的ORACLE教程是:Oracle9i的全文檢索索引技術開發人員網路Oracle。
介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什麼都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕鬆踏上高手之路。 >>
摘要 全文檢索索引技術是智能資訊管理的關鍵技術之一,Oracle Text作為Oracle9i的一個組件,提供了強大的全文檢索索引功能,用Oracle9i做後台資料庫,就可以充分利用其全文檢索索引技術,構建複雜的大型文件管理系統。本文主要介紹了Oracle Text的體繫結構及其使用。
關鍵詞 Oracle Text 全文檢索索引
Oracle一直致力於全文檢索索引技術的研究,當Oracle9i Rlease2發布之時,Oracle資料庫的全文檢索索引技術已經非常完美,Oracle Text使Oracle9i具備了強大的文本檢索能力和智能化的文本管理能力。Oracle Text是Oracle9i採用的新名稱,在Oracle8/8i中它被稱作Oracle interMedia Text,在Oracle8以前它的名稱是Oracle ConText Cartridge。使用Oracle9i和Oracle Text,可以方便而有效地利用標準的SQL工具來構建基於文本的新的開發工具或對現有應用程式進行擴充。應用程式開發人員可以在任何使用文本的Oracle資料庫應用程式中充分利用Oracle Text搜尋,應用範圍可以是現有應用程式中可搜尋的注釋欄位,也可是實現涉及多種文檔格式和複雜搜尋標準的大型文件管理系統。Oracle Text支援Oracle資料庫所支援的大多數語言的基本全文檢索搜尋功能。本文將介紹如何使用Oracle9i的全文檢索索引技術來為自己的應用提供一個優秀的解決方案。
1 Oracle Text的體系架構
是Oracle Text的體系架構。
圖1 Oracle Text的體系架構
以上面的體系架構圖為基礎,Oracle Text 索引文檔時所使用的主要邏輯步驟如下:
(1)資料存放區邏輯搜尋表的所有行,並讀取列中的資料。通常,這隻是列資料,但有些資料存放區使用列資料作為文檔資料的指標。例如,URL_DATASTORE 將列資料作為 URL 使用。
(2)過濾器提取文檔資料並將其轉換為文本表示方式。儲存二進位文檔 (如 Word 或 Acrobat 檔案) 時需要這樣做。過濾器的輸出不必是純文字格式 -- 它可以是 XML 或 HTML 之類的文字格式設定。
(3)分段器提取過濾器的輸出資訊,並將其轉換為純文字。包括 XML 和 HTML 在內的不同文字格式設定有不同的分段器。轉換為純文字涉及檢測重要文檔區段標記、移去不可見的資訊和文本重新格式化。
(4)詞法分析器提取分段器中的純文字,並將其拆分為不連續的標記。既存在空白字元分隔語言使用的詞法分析器,也存在分段複雜的亞洲語言使用的專門詞法分析器。
(5)索引引擎提取詞法分析器中的所有標記、文檔段在分段器中的位移量以及被稱為停用字詞的低資訊含量字列表,並構建反向索引。倒排索引儲存標記和含有這些標記的文檔。
[NextPage]
2 簡單的樣本
這裡先給出一個簡單樣本說利用Oracle Text實現全文檢索索引的方法與步驟,在後面在進行具體的說明。Orcale9i提供了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的步驟:
(1)建立表來儲存某些文檔。該樣本使用一個主關鍵字列來標識每個文檔,使用一個小的VARCHAR2列來儲存每個文檔。
CREATE TABLE docs (id NUMBER PRIMARY KEY, text VACHAR2(80));
(2)將兩個範例文件置入該表:
INSERT INTO docs VALUES (1,'the first doc');
INSERT INTO docs VALUES (2,'the second doc');
COMMIT;
(3)使用Oracle Text Manager來建立和修改喜好設定,喜好設定將與索引相關聯。
(4)使用Oracle Text Manager建立文本索引。另外,可以輸入以下使用預設喜好設定的 SQL 陳述式:
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
(5)使用 CONTAINS 函數,發出基於內容的文檔查詢。例如:
SELECT id FROM docs WHERE CONTAINS (text, 'first') > 0;
這將在文本列包含單詞 first (即文檔1) 的 docs 中尋找所有行。語句中的>0部分是有效Oracle SQL所必需的,Oracle SQL不支援函數的布爾傳回值。
以上只是一個簡單的樣本,旨在給出使用Oracle Text建立全文索引的完整步驟,歸納起來如下:
(1)建表並裝載文本(包含帶有需要檢索的文字欄位)
(2)配置索引
(3)建立索引
(4)發出查詢
(5)索引維護:同步與最佳化(將在後面介紹)
3 文本裝載
要實現文本的全文檢索索引首先必須把正確的文本載入到資料庫表中,預設的建立索引行為要求將文檔裝載在文本列中,儘管可以用其它方式 (包括檔案系統和 URL 形式)儲存文檔 (在"資料存放區"選項進行設定)。預設情況下,系統應該將文檔裝載在文本列中。文本列可以是VARCHAR2、CLOB、BLOB、CHAR或BFILE。注意,只有在將Oracle7系統移植到Oracle8的情況下才支援用LONG和LONG RAW 這兩個相反的列類型儲存文本。不能為列類型NCLOB、DATE和NUMBER建立索引。
關於文檔格式,因為系統能為包括HTML、PDF、Microsoft Word和純文字在內的大多數文檔格式建立索引,可以將其中的任何文件類型裝載到文本列中(在"過濾器"選項中設定)。有關所支援的文檔格式的詳細資料,可以參閱Oracle Text User's Guide and Reference 中的附錄"Supported Filter Formats"。
裝載方法主要有以下幾種:
(1)SQL INSERT 語句
(2)ctxload 可執行檔
(3)SQL*Loader
(4)從 BFILE 中裝載 LOB 的 DBMS_LOB.LOADFROMFILE() PL/SQL 過程
(5)Oracle Call Interface
[NextPage]
4 為文本建立索引
文本裝入文本列後,就可以建立Oracle Text索引。文檔以許多不同方案、格式和語言儲存。因此,每個 Oracle Text 索引有許多需要設定的選項,以針對特定情況配置索引。建立索引時,Oracle Text可使用若干個預設值,但在大多數情況下要求使用者通過指定喜好設定來配置索引。
每個索引的許多選項組成功能組,稱為"類",每個類集中體現配置的某一方面,可以認為這些類就是與文檔資料庫有關的一些問題。例如:資料存放區、過濾器、詞法分析器、相關詞表、儲存等。
每個類具有許多預定義的行為,稱之為對象。每個對象是類問題可能具有的答案,並且大多數對象都包含有屬性。通過屬性來定製對象,從而使對索引的配置更加
[1] [2] [3] 下一頁
正在看的ORACLE教程是:Oracle9i的全文檢索索引技術開發人員網路Oracle。多變以適應於不同的應用。
(1)儲存(Storage)類
儲存類指定構成Oracle Text索引的資料庫表和索引的資料表空間參數和建立參數。它僅有一個基本對象:BASIC_STORAGE,其屬性包括:I_Index_Clause、I_Table_Clause、K_Table_Clause、N_Table_Clause、P_Table_Clause、R_Table_Clause。
(2)資料存放區(Datastore)類
資料存放區:關於列中儲存文本的位置和其他資訊。預設情況下,文本直接儲存到列中,表中的每行都表示一個單獨的完整文檔。其他資料存放區位置包括儲存在單獨檔案中或以其 URL 標識的 Web 頁上。七個基本對象包括:Default_Datastore、Detail_Datastore、Direct_Datastore、File_Datastore、Multi_Column_Datastore 、URL_Datastore、User_Datastore,。
(3)文檔段組(Section Group)類
文檔段組是用於指定一組文檔段的對象。必須先定義文檔段,然後才能使用索引通過 WITHIN 運算子在文檔段內進行查詢。文檔段定義為文檔段組的一部分。包含七個基本對象:AUTO_SECTION_GROUP、BASIC_SECTION_GROUP、HTML_SECTION_GROUP、NEWS_SECTION_GROUP、NULL_SECTION_GROUP、XML_SECTION_GROUP、PATH_SECTION_GROUP。
(4)相關詞表(Wordlist)類
相關詞表標識用於索引的詞乾和模糊比對查詢選項的語言,只有一個基本對象BASIC_WORDLIST,其屬性有:Fuzzy_Match、Fuzzy_Numresults、Fuzzy_Score、Stemmer、Substring_Index、Wildcard_Maxterms、Prefix_Index、Prefix_Max_Length、Prefix_Min_Length。
(5)索引集(Index Set)
索引集是一個或多個Oracle 索引 (不是Oracle Text索引) 的集合,用於建立 CTXCAT類型的Oracle Text索引,只有一個基本對象BASIC_INDEX_SET。
(6)詞法分析器(Lexer)類
詞法分析器類標識文本使用的語言,還確定在文本中如何標識標記。預設的詞法分析器是英語或其他西歐語言,用空格、標準標點和非字母數字字元標識標記,同時禁用大小寫。包含8個基本對象:BASIC_LEXER、CHINESE_LEXER、CHINESE_VGRAM_LEXER、JAPANESE_LEXER、JAPANESE_VGRAM_LEXER、KOREAN_LEXER、KOREAN__MORPH_ LEXER、MULTI_LEXER。
(7)過濾器(Filter)類
過濾器確定如何過濾文本以建立索引。可以使用過濾器對文文書處理器處理的文檔、格式化的文檔、純文字和 HTML 文檔建立索引,包括5個基本對象:CHARSET_FILTER、INSO_FILTER INSO、NULL_FILTER、PROCEDURE_FILTER、USER_FILTER。
(8)停用字詞表(Stoplist)類
停用字詞表類是用以指定一組不編入索引的單詞 (稱為停用字詞)。有兩個基本對象:BASIC_STOPLIST (一種語言中的所有停用字詞) 、 MULTI_STOPLIST (包含多種語言中的停用字詞的多語言停用字詞表)。
5 查詢
建立了索引,就可以使用 SELECT 語句中的 CONTAINS 運算子發出文字查詢。使用 CONTAINS 可以進行兩種查詢:單詞查詢和ABOUT查詢。
5.1 詞查詢樣本
詞查詢是對輸入到 CONTAINS 運算子中單引號間的精確單詞或短語的查詢。在以下樣本中,我們將尋找文本列中包含 oracle 一詞的所有文檔。每行的分值由使用標籤 1 的 SCORE 運算子選定:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'oracle', 1) > 0;
在查詢運算式中,可以使用 AND 和 OR 等文本運算子來擷取不同結果。還可以將結構性謂詞添加到 WHERE 子句中。可以使用 count(*)、CTX_QUERY.COUNT_HITS 或 CTX_QUERY.EXPLAIN 來計算查詢的命中 (匹配) 數目。
5.2 ABOUT查詢樣本
在所有語言中,ABOUT查詢增加了某查詢所返回的相關文檔的數目。在英語中,ABOUT 查詢可以使用索引的主題片語件,該組件在預設情況下建立。這樣,運算子將根據查詢的概念返迴文檔,而不是僅依據所指定的精確單詞或短語。例如,以下查詢將尋找文本列中關於主題 politics 的所有文檔,而不是僅包含 politics 一詞的文檔:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'about(politics)', 1) > 0;
[NextPage]
6 顯示滿足查詢條件的文檔
通常,通過使用Oracle Text查詢應用程式,使用者可查看查詢所返回的文檔。使用者從命中列表中選擇一個文檔,然後應用程式以某種形式顯示該文檔。通過Oracle Text,可以用不同的方式再現文檔。例如,可以通過反白查詢詞來顯示文檔。反白的查詢詞可以是相關詞查詢中的詞,也可以是英文 ABOUT 查詢中的主題詞。
以下是關於輸出效果和用於每個輸出效果的過程的資訊:
反白的文檔,純文字格式版本(CTX_DOC.MARKUP)
反白的文檔,HTML版本(CTX_DOC.MARKUP)
反白純文字格式版本的位移量資訊(CTX_DOC.HIGHLIGHT)
反白HTML 版本的位移量資訊(CTX_DOC.HIGHLIGHT)
純文字格式版本,無反白(CTX_DOC.FILTER)
HTML版本文檔,無反白(CTX_DOC.FILTER)
7 索引維護
索引建好後,如果表中的資料發生變化,比如增加或修改了記錄,怎麼辦?由於對錶所發生的任何DML語句,都不會自動修改索引,因此,必須定時同步(sync)和最佳化(optimize)索引,以正確反映資料的變化。
在索引建好後,可以在該使用者下查到Oracle自動產生了以下幾個表:(假設索引名為myindex):
DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N
其中以I表最重要,可以查詢一下該表:
select token_text, token_count from DR$ myindex $I where rownum<=20;
查詢結果在此省略。可以看到,該表中儲存的其實就是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;
/
上一頁 [1] [2] [3] 下一頁
正在看的ORACLE教程是:Oracle9i的全文檢索索引技術開發人員網路Oracle。
Set ServerOutput on
declare
v_job number;
begin
Dbms_Job.Submit
(
job => v_job,
what => 'sync;',
next_date => sysdate, /* default */
interval => 'sysdate + 1/720' /* = 1 day / ( 24 hrs * 30 min) = 2 mins */
);
Dbms_Job.Run ( v_job );
Dbms_Output.Put_Line ( 'Submitted as job # ' || to_char ( v_job ) );
end;
/>
job的SYSDATE + (1/720)是指每隔2分鐘同步一次。具體的時間間隔,可以根據自己的應用的需要而定。
8 小結
文本對於各種規模的公司、機構組織來說,都是包含眾多豐富資訊的最有效載體,Oracle Text的推出,標誌著Oracle提供了一套嶄新的技術,可以便捷安全的用於管理企業的文本資訊。Oracle Text使應用程式開發人員可以透明地將全文檢索索引能力加入到基於SQL的應用程式中,Oracle Text也是其他Oracle產品的核心組件,比如Oracle9iAS Portal,Oracle eBusiness Suite,Oracle Ultra Search和Oracle Internet File System等。靈活運用Oracle Text提供的全文檢索索引技術,就可以使自己的應用具備強大的全文檢索索引能力。
上一頁
上一頁 [1] [2] [3]