詳解Oracle資料庫中文全文索引(1)

來源:互聯網
上載者:User

一、曆史背景

Oracle資料庫的全文檢索索引技術已經非常完美,Oracle Text使Oracle9i具備了強大的文本檢索能力和智能化的文本管理能力。Oracle Text是Oracle9i採用的新名稱,在Oracle8/8i中它被稱作Oracle interMedia Text,在Oracle8以前它的名稱是Oracle ConText Cartridge。

二、Oracle Text 索引文檔時所使用的主要邏輯步驟如下

(1) 資料存放區邏輯搜尋表的所有行,並讀取列中的資料。通常,這隻是列資料,但有些資料存放區使用列資料作為文檔資料的指標。

(2) 過濾器提取文檔資料並將其轉換為文本表示方式。儲存二進位文檔 (如 Word 或 Acrobat 檔案) 時需要這樣做。過濾器的輸出不必是純文字格式 -- 它可以是 XML 或 HTML 之類的文字格式設定。

(3) 分段器提取過濾器的輸出資訊,並將其轉換為純文字。包括 XML 和 HTML 在內的不同文字格式設定有不同的分段器。轉換為純文字涉及檢測重要文檔區段標記、移去不可見的資訊和文本重新格式化。

(4) 詞法分析器提取分段器中的純文字,並將其拆分為不連續的標記。既存在空白字元分隔語言使用的詞法分析器,也存在分段複雜的亞洲語言使用的專門詞法分析器。

(5) 索引引擎提取詞法分析器中的所有標記、文檔段在分段器中的位移量以及被稱為停用字詞的低資訊含量字列表,並構建反向索引。倒排索引儲存標記和含有這些標記的文檔。

三、需要的許可權

要使用Oracle Text,必須具有CTXAPP角色或者是CTXSYS使用者。Oracle Text為系統管理員提供CTXSYS使用者,為應用程式開發人員提供CTXAPP角色。具有CTXAPP角色的使用者可執行以下任務:建立索引,管理 Oracle Text 資料字典,包括建立和刪除喜好設定,進行Oracle Text 查詢,使用 Oracle Text PL/SQL程式包。

四、具體的實現

文本裝入文本列後,就可以建立Oracle Text索引。文檔以許多不同方案、格式和語言儲存。因此,每個 Oracle Text 索引有許多需要設定的選項,以針對特定情況配置索引。建立索引時,Oracle Text可使用若干個預設值,但在大多數情況下要求使用者通過指定喜好設定來配置索引。

每個索引的許多選項組成功能組,稱為"類",每個類集中體現配置的某一方面,可以認為這些類就是與文檔資料庫有關的一些問題。例如:資料存放區、過濾器、詞法分析器、相關詞表、儲存等。

每個類具有許多預定義的行為,稱之為對象。每個對象是類問題可能具有的答案,並且大多數對象都包含有屬性。通過屬性來定製對象,從而使對索引的配置更加多變以適應於不同的應用。

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 (包含多種語言中的停用字詞的多語言停用字詞表)。

具體操作實踐

1、 建立詞法分析器及相關詞表

Begin

-- 定義一個詞法分析器

ctx_ddl.drop_preference('cnlex');

ctx_ddl.create_preference('cnlex','CHINESE_LEXER'); --針對中文

-- 定義一個相關詞表

ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST');

ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE');

ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH',1);

ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', 5);

ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');

end;

// 上面的語句中,如果是針對英語語種則可以採用下面的語句來定義詞法分析器

ctx_ddl.create_preference('mylex','BASIC_LEXER');

ctx_ddl.set_attribute('mylex','printjoins','_-');

2、 在需要建立全文索引的表中建立索引索引類型必須是 ctxsys.context,即應用上下文索引)

create index idx_person_desc on personinfo(persondesc)

indextype is ctxsys.context

parameters (

'DATASTORE CTXSYS.DIRECT_DATASTORE FILTER

CTXSYS.NULL_FILTER LEXER cnlex WORDLIST mywordlist');

-- 請注意此處採用的是NULL_FILTER過濾器,如果採用INSO_FILTER則不能對中文進行全文索引

3、進行全文索引的同步

exec ctx_ddl.sync_index('idx_user_info', '20M');


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.