摘要
全文檢索技術(shù)是智能信息管理的關(guān)鍵技術(shù)之一,Oracle Text作為Oracle9i的一個組件,提供了強(qiáng)大的全文檢索功能,用Oracle9i做后臺數(shù)據(jù)庫,就可以充分利用其全文檢索技術(shù),構(gòu)建復(fù)雜的大型文檔管理系統(tǒng)。本文主要介紹了Oracle Text的體系結(jié)構(gòu)及其使用。
關(guān)鍵詞 Oracle Text 全文檢索
Oracle一直致力于全文檢索技術(shù)的研究,當(dāng)Oracle9i Rlease2發(fā)布之時,Oracle數(shù)據(jù)庫的全文檢索技術(shù)已經(jīng)非常完美,Oracle Text使Oracle9i具備了強(qiáng)大的文本檢索能力和智能化的文本管理能力。Oracle Text是Oracle9i采用的新名稱,在Oracle8/8i中它被稱作Oracle interMedia Text,在Oracle8以前它的名稱是Oracle ConText Cartridge。使用Oracle9i和Oracle Text,可以方便而有效地利用標(biāo)準(zhǔn)的SQL工具來構(gòu)建基于文本的新的開發(fā)工具或?qū)ΜF(xiàn)有應(yīng)用程序進(jìn)行擴(kuò)展。應(yīng)用程序開發(fā)人員可以在任何使用文本的Oracle數(shù)據(jù)庫應(yīng)用程序中充分利用Oracle Text搜索,應(yīng)用范圍可以是現(xiàn)有應(yīng)用程序中可搜索的注釋字段,也可是實(shí)現(xiàn)涉及多種文檔格式和復(fù)雜搜索標(biāo)準(zhǔn)的大型文檔管理系統(tǒng)。Oracle Text支持Oracle數(shù)據(jù)庫所支持的大多數(shù)語言的基本全文搜索功能。本文將介紹如何使用Oracle9i的全文檢索技術(shù)來為自己的應(yīng)用提供一個優(yōu)秀的解決方案。
1 Oracle Text的體系架構(gòu)
下圖是Oracle Text的體系架構(gòu)。
圖1 Oracle Text的體系架構(gòu)
以上面的體系架構(gòu)圖為基礎(chǔ),Oracle Text 索引文檔時所使用的主要邏輯步驟如下:
(1)數(shù)據(jù)存儲邏輯搜索表的所有行,并讀取列中的數(shù)據(jù)。通常,這只是列數(shù)據(jù),但有些數(shù)據(jù)存儲使用列數(shù)據(jù)作為文檔數(shù)據(jù)的指針。例如,URL_DATASTORE 將列數(shù)據(jù)作為 URL 使用。
?。?)過濾器提取文檔數(shù)據(jù)并將其轉(zhuǎn)換為文本表示方式。存儲二進(jìn)制文檔 (如 Word 或 Acrobat 文件) 時需要這樣做。過濾器的輸出不必是純文本格式 -- 它可以是 XML 或 HTML 之類的文本格式。
?。?)分段器提取過濾器的輸出信息,并將其轉(zhuǎn)換為純文本。包括 XML 和 HTML 在內(nèi)的不同文本格式有不同的分段器。轉(zhuǎn)換為純文本涉及檢測重要文檔段標(biāo)記、移去不可見的信息和文本重新格式化。
(4)詞法分析器提取分段器中的純文本,并將其拆分為不連續(xù)的標(biāo)記。既存在空白字符分隔語言使用的詞法分析器,也存在分段復(fù)雜的亞洲語言使用的專門詞法分析器。
?。?)索引引擎提取詞法分析器中的所有標(biāo)記、文檔段在分段器中的偏移量以及被稱為非索引字的低信息含量字列表,并構(gòu)建反向索引。倒排索引存儲標(biāo)記和含有這些標(biāo)記的文檔。
2 簡單的示例
這里先給出一個簡單示例說利用Oracle Text實(shí)現(xiàn)全文檢索的方法與步驟,在后面在進(jìn)行具體的說明。Orcale9i提供了Oracle Text Manager可以簡化許多工作,所有在Oracle Text Manager中完成的工作,都可以在通過PL/SQL來實(shí)現(xiàn)。要使用Oracle Text,必須具有CTXAPP角色或者是CTXSYS用戶。Oracle Text為系統(tǒng)管理員提供CTXSYS用戶,為應(yīng)用程序開發(fā)人員提供CTXAPP角色。
CTXSYS用戶可執(zhí)行以下任務(wù):啟動Oracle Text服務(wù)器,執(zhí)行CTXAPP角色的所有任務(wù)。
具有CTXAPP角色的用戶可執(zhí)行以下任務(wù): 創(chuàng)建索引,管理 Oracle Text 數(shù)據(jù)字典,包括創(chuàng)建和刪除首選項(xiàng),進(jìn)行Oracle Text 查詢,使用 Oracle Text PL/SQL程序包。
使用Oracle Text的步驟:
?。?)創(chuàng)建表來保存某些文檔。該示例使用一個主關(guān)鍵字列來標(biāo)識每個文檔,使用一個小的VARCHAR2列來保存每個文檔。
CREATE TABLE docs (id NUMBER PRIMARY KEY, text VACHAR2(80));
?。?)將兩個示例文檔置入該表:
INSERT INTO docs VALUES (1,'the first doc');
INSERT INTO docs VALUES (2,'the second doc');
COMMIT;
(3)使用Oracle Text Manager來創(chuàng)建和修改首選項(xiàng),首選項(xiàng)將與索引相關(guān)聯(lián)。
(4)使用Oracle Text Manager創(chuàng)建文本索引。另外,可以輸入以下使用默認(rèn)首選項(xiàng)的 SQL 語句:
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
(5)使用 CONTAINS 函數(shù),發(fā)出基于內(nèi)容的文檔查詢。例如:
SELECT id FROM docs WHERE CONTAINS (text, 'first') > 0;
這將在文本列包含單詞 first (即文檔1) 的 docs 中查找所有行。語句中的>0部分是有效的Oracle SQL所必需的,Oracle SQL不支持函數(shù)的布爾返回值。
以上只是一個簡單的示例,旨在給出使用Oracle Text建立全文索引的完整步驟,歸納起來如下:
(1)建表并裝載文本(包含帶有需要檢索的文本字段)
(2)配置索引
(3)建立索引
?。?)發(fā)出查詢
?。?)索引維護(hù):同步與優(yōu)化(將在后面介紹)
3 文本裝載
要實(shí)現(xiàn)文本的全文檢索首先必須把正確的文本加載到數(shù)據(jù)庫表中,默認(rèn)的建立索引行為要求將文檔裝載在文本列中,盡管可以用其它方式 (包括文件系統(tǒng)和 URL 形式)存儲文檔 (在"數(shù)據(jù)存儲"選項(xiàng)進(jìn)行設(shè)置)。默認(rèn)情況下,系統(tǒng)應(yīng)該將文檔裝載在文本列中。文本列可以是VARCHAR2、CLOB、BLOB、CHAR或BFILE。注意,只有在將Oracle7系統(tǒng)移植到Oracle8的情況下才支持用LONG和LONG RAW 這兩個相反的列類型存儲文本。不能為列類型NCLOB、DATE和NUMBER建立索引。
關(guān)于文檔格式,因?yàn)橄到y(tǒng)能為包括HTML、PDF、Microsoft Word和純文本在內(nèi)的大多數(shù)文檔格式建立索引,可以將其中的任何文檔類型裝載到文本列中(在"過濾器"選項(xiàng)中設(shè)置)。有關(guān)所支持的文檔格式的詳細(xì)信息,可以參閱Oracle Text User's Guide and Reference 中的附錄"Supported Filter Formats"。
裝載方法主要有以下幾種:
(1)SQL INSERT 語句
?。?)ctxload 可執(zhí)行文件
?。?)SQL*Loader
?。?)從 BFILE 中裝載 LOB 的 DBMS_LOB.LOADFROMFILE() PL/SQL 過程
?。?)Oracle Call Interface
4 為文本建立索引
文本裝入文本列后,就可以創(chuàng)建Oracle Text索引。文檔以許多不同方案、格式和語言存儲。因此,每個 Oracle Text 索引有許多需要設(shè)置的選項(xiàng),以針對特定情況配置索引。創(chuàng)建索引時,Oracle Text可使用若干個默認(rèn)值,但在大多數(shù)情況下要求用戶通過指定首選項(xiàng)來配置索引。
每個索引的許多選項(xiàng)組成功能組,稱為"類",每個類集中體現(xiàn)配置的某一方面,可以認(rèn)為這些類就是與文檔數(shù)據(jù)庫有關(guān)的一些問題。例如:數(shù)據(jù)存儲、過濾器、詞法分析器、相關(guān)詞表、存儲等。
每個類具有許多預(yù)定義的行為,稱之為對象。每個對象是類問題可能具有的答案,并且大多數(shù)對象都包含有屬性。通過屬性來定制對象,從而使對索引的配置更加多變以適應(yīng)于不同的應(yīng)用。
(1)存儲(Storage)類
存儲類指定構(gòu)成Oracle Text索引的數(shù)據(jù)庫表和索引的表空間參數(shù)和創(chuàng)建參數(shù)。它僅有一個基本對象:BASIC_STORAGE,其屬性包括:I_Index_Clause、I_Table_Clause、K_Table_Clause、N_Table_Clause、P_Table_Clause、R_Table_Clause。
(2)數(shù)據(jù)存儲(Datastore)類
數(shù)據(jù)存儲:關(guān)于列中存儲文本的位置和其他信息。默認(rèn)情況下,文本直接存儲到列中,表中的每行都表示一個單獨(dú)的完整文檔。其他數(shù)據(jù)存儲位置包括存儲在單獨(dú)文件中或以其 URL 標(biāo)識的 Web 頁上。七個基本對象包括:Default_Datastore、Detail_Datastore、Direct_Datastore、File_Datastore、Multi_Column_Datastore 、URL_Datastore、User_Datastore,。
(3)文檔段組(Section Group)類
文檔段組是用于指定一組文檔段的對象。必須先定義文檔段,然后才能使用索引通過 WITHIN 運(yùn)算符在文檔段內(nèi)進(jìn)行查詢。文檔段定義為文檔段組的一部分。包含七個基本對象:AUTO_SECTION_GROUP、BASIC_SECTION_GROUP、HTML_SECTION_GROUP、NEWS_SECTION_GROUP、NULL_SECTION_GROUP、XML_SECTION_GROUP、PATH_SECTION_GROUP。
?。?)相關(guān)詞表(Wordlist)類
相關(guān)詞表標(biāo)識用于索引的詞干和模糊匹配查詢選項(xiàng)的語言,只有一個基本對象BASIC_WORDLIST,其屬性有:Fuzzy_Match、Fuzzy_Numresults、Fuzzy_Score、Stemmer、Substring_Index、Wildcard_Maxterms、Prefix_Index、Prefix_Max_Length、Prefix_Min_Length。
?。?)索引集(Index Set)
索引集是一個或多個Oracle 索引 (不是Oracle Text索引) 的集合,用于創(chuàng)建 CTXCAT類型的Oracle Text索引,只有一個基本對象BASIC_INDEX_SET。
?。?)詞法分析器(Lexer)類
詞法分析器類標(biāo)識文本使用的語言,還確定在文本中如何標(biāo)識標(biāo)記。默認(rèn)的詞法分析器是英語或其他西歐語言,用空格、標(biāo)準(zhǔn)標(biāo)點(diǎn)和非字母數(shù)字字符標(biāo)識標(biāo)記,同時禁用大小寫。包含8個基本對象:BASIC_LEXER、CHINESE_LEXER、CHINESE_VGRAM_LEXER、JAPANESE_LEXER、JAPANESE_VGRAM_LEXER、KOREAN_LEXER、KOREAN__MORPH_ LEXER、MULTI_LEXER。
?。?)過濾器(Filter)類
過濾器確定如何過濾文本以建立索引。可以使用過濾器對文字處理器處理的文檔、格式化的文檔、純文本和 HTML 文檔建立索引,包括5個基本對象:CHARSET_FILTER、INSO_FILTER INSO、NULL_FILTER、PROCEDURE_FILTER、USER_FILTER。
?。?)非索引字表(Stoplist)類
非索引字表類是用以指定一組不編入索引的單詞 (稱為非索引字)。有兩個基本對象:BASIC_STOPLIST (一種語言中的所有非索引字) 、 MULTI_STOPLIST (包含多種語言中的非索引字的多語言非索引字表)。
5 查詢
建立了索引,就可以使用 SELECT 語句中的 CONTAINS 運(yùn)算符發(fā)出文本查詢。使用 CONTAINS 可以進(jìn)行兩種查詢:單詞查詢和ABOUT查詢。
5.1 詞查詢示例
詞查詢是對輸入到 CONTAINS 運(yùn)算符中單引號間的精確單詞或短語的查詢。在以下示例中,我們將查找文本列中包含 oracle 一詞的所有文檔。每行的分值由使用標(biāo)簽 1 的 SCORE 運(yùn)算符選定:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'oracle', 1) > 0;
在查詢表達(dá)式中,可以使用 AND 和 OR 等文本運(yùn)算符來獲取不同結(jié)果。還可以將結(jié)構(gòu)性謂詞添加到 WHERE 子句中??梢允褂?count(*)、CTX_QUERY.COUNT_HITS 或 CTX_QUERY.EXPLAIN 來計(jì)算查詢的命中 (匹配) 數(shù)目。
5.2 ABOUT查詢示例
在所有語言中,ABOUT查詢增加了某查詢所返回的相關(guān)文檔的數(shù)目。在英語中,ABOUT 查詢可以使用索引的主題詞組件,該組件在默認(rèn)情況下創(chuàng)建。這樣,運(yùn)算符將根據(jù)查詢的概念返回文檔,而不是僅依據(jù)所指定的精確單詞或短語。例如,以下查詢將查找文本列中關(guān)于主題 politics 的所有文檔,而不是僅包含 politics 一詞的文檔:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'about(politics)', 1) > 0;
6 顯示滿足查詢條件的文檔
通常,通過使用Oracle Text查詢應(yīng)用程序,用戶可查看查詢所返回的文檔。用戶從命中列表中選擇一個文檔,然后應(yīng)用程序以某種形式顯示該文檔。通過Oracle Text,可以用不同的方式再現(xiàn)文檔。例如,可以通過突出顯示查詢詞來顯示文檔。突出顯示的查詢詞可以是相關(guān)詞查詢中的詞,也可以是英文 ABOUT 查詢中的主題詞。
以下是關(guān)于輸出效果和用于每個輸出效果的過程的信息:
突出顯示的文檔,純文本格式版本(CTX_DOC.MARKUP)
突出顯示的文檔,HTML版本(CTX_DOC.MARKUP)
突出顯示純文本格式版本的偏移量信息(CTX_DOC.HIGHLIGHT)
突出顯示HTML 版本的偏移量信息(CTX_DOC.HIGHLIGHT)
純文本格式版本,無突出顯示(CTX_DOC.FILTER)
HTML版本文檔,無突出顯示(CTX_DOC.FILTER)
7 索引維護(hù)
索引建好后,如果表中的數(shù)據(jù)發(fā)生變化,比如增加或修改了記錄,怎么辦?由于對表所發(fā)生的任何DML語句,都不會自動修改索引,因此,必須定時同步(sync)和優(yōu)化(optimize)索引,以正確反映數(shù)據(jù)的變化。
在索引建好后,可以在該用戶下查到Oracle自動產(chǎn)生了以下幾個表:(假設(shè)索引名為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;
查詢結(jié)果在此省略。可以看到,該表中保存的其實(shí)就是Oracle 分析你的文檔后,生成的term記錄在這里,包括term出現(xiàn)的位置、次數(shù)、hash值等。當(dāng)文檔的內(nèi)容改變后,可以想見這個I表的內(nèi)容也應(yīng)該相應(yīng)改變,才能保證Oracle在做全文檢索時正確檢索到內(nèi)容(因?yàn)樗^全文檢索,其實(shí)核心就是查詢這個表)。那么如何維護(hù)該表的內(nèi)容,不能每次數(shù)據(jù)改變都重新建立索引,這就要用到sync 和 optimize了。
同步(sync):將新的term 保存到I表;
優(yōu)化(optimize):清除I表的垃圾,主要是將已經(jīng)被刪除的term從I表刪除。
Oracle提供了一個所謂的ctx server來做這個同步和優(yōu)化的工作,只需要在后臺運(yùn)行這個進(jìn)程,它會監(jiān)視數(shù)據(jù)的變化,及時進(jìn)行同步。另外,也可以用以下的job來完成(該job要建在和表同一個用戶下):
job的SYSDATE + (1/720)是指每隔2分鐘同步一次。具體的時間間隔,可以根據(jù)自己的應(yīng)用的需要而定。
8 小結(jié)
文本對于各種規(guī)模的公司、機(jī)構(gòu)組織來說,都是包含眾多豐富信息的最有效載體,Oracle Text的推出,標(biāo)志著Oracle提供了一套嶄新的技術(shù),可以便捷安全的用于管理企業(yè)的文本信息。Oracle Text使應(yīng)用程序開發(fā)者可以透明地將全文檢索能力加入到基于SQL的應(yīng)用程序中,Oracle Text也是其他Oracle產(chǎn)品的核心組件,比如Oracle9iAS Portal,Oracle eBusiness Suite,Oracle Ultra Search和Oracle Internet File System等。靈活運(yùn)用Oracle Text提供的全文檢索技術(shù),就可以使自己的應(yīng)用具備強(qiáng)大的全文檢索能力。
關(guān)鍵詞 Oracle Text 全文檢索
Oracle一直致力于全文檢索技術(shù)的研究,當(dāng)Oracle9i Rlease2發(fā)布之時,Oracle數(shù)據(jù)庫的全文檢索技術(shù)已經(jīng)非常完美,Oracle Text使Oracle9i具備了強(qiáng)大的文本檢索能力和智能化的文本管理能力。Oracle Text是Oracle9i采用的新名稱,在Oracle8/8i中它被稱作Oracle interMedia Text,在Oracle8以前它的名稱是Oracle ConText Cartridge。使用Oracle9i和Oracle Text,可以方便而有效地利用標(biāo)準(zhǔn)的SQL工具來構(gòu)建基于文本的新的開發(fā)工具或?qū)ΜF(xiàn)有應(yīng)用程序進(jìn)行擴(kuò)展。應(yīng)用程序開發(fā)人員可以在任何使用文本的Oracle數(shù)據(jù)庫應(yīng)用程序中充分利用Oracle Text搜索,應(yīng)用范圍可以是現(xiàn)有應(yīng)用程序中可搜索的注釋字段,也可是實(shí)現(xiàn)涉及多種文檔格式和復(fù)雜搜索標(biāo)準(zhǔn)的大型文檔管理系統(tǒng)。Oracle Text支持Oracle數(shù)據(jù)庫所支持的大多數(shù)語言的基本全文搜索功能。本文將介紹如何使用Oracle9i的全文檢索技術(shù)來為自己的應(yīng)用提供一個優(yōu)秀的解決方案。
1 Oracle Text的體系架構(gòu)
下圖是Oracle Text的體系架構(gòu)。
圖1 Oracle Text的體系架構(gòu)
以上面的體系架構(gòu)圖為基礎(chǔ),Oracle Text 索引文檔時所使用的主要邏輯步驟如下:
(1)數(shù)據(jù)存儲邏輯搜索表的所有行,并讀取列中的數(shù)據(jù)。通常,這只是列數(shù)據(jù),但有些數(shù)據(jù)存儲使用列數(shù)據(jù)作為文檔數(shù)據(jù)的指針。例如,URL_DATASTORE 將列數(shù)據(jù)作為 URL 使用。
?。?)過濾器提取文檔數(shù)據(jù)并將其轉(zhuǎn)換為文本表示方式。存儲二進(jìn)制文檔 (如 Word 或 Acrobat 文件) 時需要這樣做。過濾器的輸出不必是純文本格式 -- 它可以是 XML 或 HTML 之類的文本格式。
?。?)分段器提取過濾器的輸出信息,并將其轉(zhuǎn)換為純文本。包括 XML 和 HTML 在內(nèi)的不同文本格式有不同的分段器。轉(zhuǎn)換為純文本涉及檢測重要文檔段標(biāo)記、移去不可見的信息和文本重新格式化。
(4)詞法分析器提取分段器中的純文本,并將其拆分為不連續(xù)的標(biāo)記。既存在空白字符分隔語言使用的詞法分析器,也存在分段復(fù)雜的亞洲語言使用的專門詞法分析器。
?。?)索引引擎提取詞法分析器中的所有標(biāo)記、文檔段在分段器中的偏移量以及被稱為非索引字的低信息含量字列表,并構(gòu)建反向索引。倒排索引存儲標(biāo)記和含有這些標(biāo)記的文檔。
2 簡單的示例
這里先給出一個簡單示例說利用Oracle Text實(shí)現(xiàn)全文檢索的方法與步驟,在后面在進(jìn)行具體的說明。Orcale9i提供了Oracle Text Manager可以簡化許多工作,所有在Oracle Text Manager中完成的工作,都可以在通過PL/SQL來實(shí)現(xiàn)。要使用Oracle Text,必須具有CTXAPP角色或者是CTXSYS用戶。Oracle Text為系統(tǒng)管理員提供CTXSYS用戶,為應(yīng)用程序開發(fā)人員提供CTXAPP角色。
CTXSYS用戶可執(zhí)行以下任務(wù):啟動Oracle Text服務(wù)器,執(zhí)行CTXAPP角色的所有任務(wù)。
具有CTXAPP角色的用戶可執(zhí)行以下任務(wù): 創(chuàng)建索引,管理 Oracle Text 數(shù)據(jù)字典,包括創(chuàng)建和刪除首選項(xiàng),進(jìn)行Oracle Text 查詢,使用 Oracle Text PL/SQL程序包。
使用Oracle Text的步驟:
?。?)創(chuàng)建表來保存某些文檔。該示例使用一個主關(guān)鍵字列來標(biāo)識每個文檔,使用一個小的VARCHAR2列來保存每個文檔。
CREATE TABLE docs (id NUMBER PRIMARY KEY, text VACHAR2(80));
?。?)將兩個示例文檔置入該表:
INSERT INTO docs VALUES (1,'the first doc');
INSERT INTO docs VALUES (2,'the second doc');
COMMIT;
(3)使用Oracle Text Manager來創(chuàng)建和修改首選項(xiàng),首選項(xiàng)將與索引相關(guān)聯(lián)。
(4)使用Oracle Text Manager創(chuàng)建文本索引。另外,可以輸入以下使用默認(rèn)首選項(xiàng)的 SQL 語句:
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
(5)使用 CONTAINS 函數(shù),發(fā)出基于內(nèi)容的文檔查詢。例如:
SELECT id FROM docs WHERE CONTAINS (text, 'first') > 0;
這將在文本列包含單詞 first (即文檔1) 的 docs 中查找所有行。語句中的>0部分是有效的Oracle SQL所必需的,Oracle SQL不支持函數(shù)的布爾返回值。
以上只是一個簡單的示例,旨在給出使用Oracle Text建立全文索引的完整步驟,歸納起來如下:
(1)建表并裝載文本(包含帶有需要檢索的文本字段)
(2)配置索引
(3)建立索引
?。?)發(fā)出查詢
?。?)索引維護(hù):同步與優(yōu)化(將在后面介紹)
3 文本裝載
要實(shí)現(xiàn)文本的全文檢索首先必須把正確的文本加載到數(shù)據(jù)庫表中,默認(rèn)的建立索引行為要求將文檔裝載在文本列中,盡管可以用其它方式 (包括文件系統(tǒng)和 URL 形式)存儲文檔 (在"數(shù)據(jù)存儲"選項(xiàng)進(jìn)行設(shè)置)。默認(rèn)情況下,系統(tǒng)應(yīng)該將文檔裝載在文本列中。文本列可以是VARCHAR2、CLOB、BLOB、CHAR或BFILE。注意,只有在將Oracle7系統(tǒng)移植到Oracle8的情況下才支持用LONG和LONG RAW 這兩個相反的列類型存儲文本。不能為列類型NCLOB、DATE和NUMBER建立索引。
關(guān)于文檔格式,因?yàn)橄到y(tǒng)能為包括HTML、PDF、Microsoft Word和純文本在內(nèi)的大多數(shù)文檔格式建立索引,可以將其中的任何文檔類型裝載到文本列中(在"過濾器"選項(xiàng)中設(shè)置)。有關(guān)所支持的文檔格式的詳細(xì)信息,可以參閱Oracle Text User's Guide and Reference 中的附錄"Supported Filter Formats"。
裝載方法主要有以下幾種:
(1)SQL INSERT 語句
?。?)ctxload 可執(zhí)行文件
?。?)SQL*Loader
?。?)從 BFILE 中裝載 LOB 的 DBMS_LOB.LOADFROMFILE() PL/SQL 過程
?。?)Oracle Call Interface
4 為文本建立索引
文本裝入文本列后,就可以創(chuàng)建Oracle Text索引。文檔以許多不同方案、格式和語言存儲。因此,每個 Oracle Text 索引有許多需要設(shè)置的選項(xiàng),以針對特定情況配置索引。創(chuàng)建索引時,Oracle Text可使用若干個默認(rèn)值,但在大多數(shù)情況下要求用戶通過指定首選項(xiàng)來配置索引。
每個索引的許多選項(xiàng)組成功能組,稱為"類",每個類集中體現(xiàn)配置的某一方面,可以認(rèn)為這些類就是與文檔數(shù)據(jù)庫有關(guān)的一些問題。例如:數(shù)據(jù)存儲、過濾器、詞法分析器、相關(guān)詞表、存儲等。
每個類具有許多預(yù)定義的行為,稱之為對象。每個對象是類問題可能具有的答案,并且大多數(shù)對象都包含有屬性。通過屬性來定制對象,從而使對索引的配置更加多變以適應(yīng)于不同的應(yīng)用。
(1)存儲(Storage)類
存儲類指定構(gòu)成Oracle Text索引的數(shù)據(jù)庫表和索引的表空間參數(shù)和創(chuàng)建參數(shù)。它僅有一個基本對象:BASIC_STORAGE,其屬性包括:I_Index_Clause、I_Table_Clause、K_Table_Clause、N_Table_Clause、P_Table_Clause、R_Table_Clause。
(2)數(shù)據(jù)存儲(Datastore)類
數(shù)據(jù)存儲:關(guān)于列中存儲文本的位置和其他信息。默認(rèn)情況下,文本直接存儲到列中,表中的每行都表示一個單獨(dú)的完整文檔。其他數(shù)據(jù)存儲位置包括存儲在單獨(dú)文件中或以其 URL 標(biāo)識的 Web 頁上。七個基本對象包括:Default_Datastore、Detail_Datastore、Direct_Datastore、File_Datastore、Multi_Column_Datastore 、URL_Datastore、User_Datastore,。
(3)文檔段組(Section Group)類
文檔段組是用于指定一組文檔段的對象。必須先定義文檔段,然后才能使用索引通過 WITHIN 運(yùn)算符在文檔段內(nèi)進(jìn)行查詢。文檔段定義為文檔段組的一部分。包含七個基本對象:AUTO_SECTION_GROUP、BASIC_SECTION_GROUP、HTML_SECTION_GROUP、NEWS_SECTION_GROUP、NULL_SECTION_GROUP、XML_SECTION_GROUP、PATH_SECTION_GROUP。
?。?)相關(guān)詞表(Wordlist)類
相關(guān)詞表標(biāo)識用于索引的詞干和模糊匹配查詢選項(xiàng)的語言,只有一個基本對象BASIC_WORDLIST,其屬性有:Fuzzy_Match、Fuzzy_Numresults、Fuzzy_Score、Stemmer、Substring_Index、Wildcard_Maxterms、Prefix_Index、Prefix_Max_Length、Prefix_Min_Length。
?。?)索引集(Index Set)
索引集是一個或多個Oracle 索引 (不是Oracle Text索引) 的集合,用于創(chuàng)建 CTXCAT類型的Oracle Text索引,只有一個基本對象BASIC_INDEX_SET。
?。?)詞法分析器(Lexer)類
詞法分析器類標(biāo)識文本使用的語言,還確定在文本中如何標(biāo)識標(biāo)記。默認(rèn)的詞法分析器是英語或其他西歐語言,用空格、標(biāo)準(zhǔn)標(biāo)點(diǎn)和非字母數(shù)字字符標(biāo)識標(biāo)記,同時禁用大小寫。包含8個基本對象:BASIC_LEXER、CHINESE_LEXER、CHINESE_VGRAM_LEXER、JAPANESE_LEXER、JAPANESE_VGRAM_LEXER、KOREAN_LEXER、KOREAN__MORPH_ LEXER、MULTI_LEXER。
?。?)過濾器(Filter)類
過濾器確定如何過濾文本以建立索引。可以使用過濾器對文字處理器處理的文檔、格式化的文檔、純文本和 HTML 文檔建立索引,包括5個基本對象:CHARSET_FILTER、INSO_FILTER INSO、NULL_FILTER、PROCEDURE_FILTER、USER_FILTER。
?。?)非索引字表(Stoplist)類
非索引字表類是用以指定一組不編入索引的單詞 (稱為非索引字)。有兩個基本對象:BASIC_STOPLIST (一種語言中的所有非索引字) 、 MULTI_STOPLIST (包含多種語言中的非索引字的多語言非索引字表)。
5 查詢
建立了索引,就可以使用 SELECT 語句中的 CONTAINS 運(yùn)算符發(fā)出文本查詢。使用 CONTAINS 可以進(jìn)行兩種查詢:單詞查詢和ABOUT查詢。
5.1 詞查詢示例
詞查詢是對輸入到 CONTAINS 運(yùn)算符中單引號間的精確單詞或短語的查詢。在以下示例中,我們將查找文本列中包含 oracle 一詞的所有文檔。每行的分值由使用標(biāo)簽 1 的 SCORE 運(yùn)算符選定:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'oracle', 1) > 0;
在查詢表達(dá)式中,可以使用 AND 和 OR 等文本運(yùn)算符來獲取不同結(jié)果。還可以將結(jié)構(gòu)性謂詞添加到 WHERE 子句中??梢允褂?count(*)、CTX_QUERY.COUNT_HITS 或 CTX_QUERY.EXPLAIN 來計(jì)算查詢的命中 (匹配) 數(shù)目。
5.2 ABOUT查詢示例
在所有語言中,ABOUT查詢增加了某查詢所返回的相關(guān)文檔的數(shù)目。在英語中,ABOUT 查詢可以使用索引的主題詞組件,該組件在默認(rèn)情況下創(chuàng)建。這樣,運(yùn)算符將根據(jù)查詢的概念返回文檔,而不是僅依據(jù)所指定的精確單詞或短語。例如,以下查詢將查找文本列中關(guān)于主題 politics 的所有文檔,而不是僅包含 politics 一詞的文檔:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'about(politics)', 1) > 0;
6 顯示滿足查詢條件的文檔
通常,通過使用Oracle Text查詢應(yīng)用程序,用戶可查看查詢所返回的文檔。用戶從命中列表中選擇一個文檔,然后應(yīng)用程序以某種形式顯示該文檔。通過Oracle Text,可以用不同的方式再現(xiàn)文檔。例如,可以通過突出顯示查詢詞來顯示文檔。突出顯示的查詢詞可以是相關(guān)詞查詢中的詞,也可以是英文 ABOUT 查詢中的主題詞。
以下是關(guān)于輸出效果和用于每個輸出效果的過程的信息:
突出顯示的文檔,純文本格式版本(CTX_DOC.MARKUP)
突出顯示的文檔,HTML版本(CTX_DOC.MARKUP)
突出顯示純文本格式版本的偏移量信息(CTX_DOC.HIGHLIGHT)
突出顯示HTML 版本的偏移量信息(CTX_DOC.HIGHLIGHT)
純文本格式版本,無突出顯示(CTX_DOC.FILTER)
HTML版本文檔,無突出顯示(CTX_DOC.FILTER)
7 索引維護(hù)
索引建好后,如果表中的數(shù)據(jù)發(fā)生變化,比如增加或修改了記錄,怎么辦?由于對表所發(fā)生的任何DML語句,都不會自動修改索引,因此,必須定時同步(sync)和優(yōu)化(optimize)索引,以正確反映數(shù)據(jù)的變化。
在索引建好后,可以在該用戶下查到Oracle自動產(chǎn)生了以下幾個表:(假設(shè)索引名為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;
查詢結(jié)果在此省略。可以看到,該表中保存的其實(shí)就是Oracle 分析你的文檔后,生成的term記錄在這里,包括term出現(xiàn)的位置、次數(shù)、hash值等。當(dāng)文檔的內(nèi)容改變后,可以想見這個I表的內(nèi)容也應(yīng)該相應(yīng)改變,才能保證Oracle在做全文檢索時正確檢索到內(nèi)容(因?yàn)樗^全文檢索,其實(shí)核心就是查詢這個表)。那么如何維護(hù)該表的內(nèi)容,不能每次數(shù)據(jù)改變都重新建立索引,這就要用到sync 和 optimize了。
同步(sync):將新的term 保存到I表;
優(yōu)化(optimize):清除I表的垃圾,主要是將已經(jīng)被刪除的term從I表刪除。
Oracle提供了一個所謂的ctx server來做這個同步和優(yōu)化的工作,只需要在后臺運(yùn)行這個進(jìn)程,它會監(jiān)視數(shù)據(jù)的變化,及時進(jìn)行同步。另外,也可以用以下的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_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分鐘同步一次。具體的時間間隔,可以根據(jù)自己的應(yīng)用的需要而定。
8 小結(jié)
文本對于各種規(guī)模的公司、機(jī)構(gòu)組織來說,都是包含眾多豐富信息的最有效載體,Oracle Text的推出,標(biāo)志著Oracle提供了一套嶄新的技術(shù),可以便捷安全的用于管理企業(yè)的文本信息。Oracle Text使應(yīng)用程序開發(fā)者可以透明地將全文檢索能力加入到基于SQL的應(yīng)用程序中,Oracle Text也是其他Oracle產(chǎn)品的核心組件,比如Oracle9iAS Portal,Oracle eBusiness Suite,Oracle Ultra Search和Oracle Internet File System等。靈活運(yùn)用Oracle Text提供的全文檢索技術(shù),就可以使自己的應(yīng)用具備強(qiáng)大的全文檢索能力。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
