時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
一、歷史背景
Oracle數(shù)據(jù)庫(kù)的全文檢索技術(shù)已經(jīng)非常完美,Oracle Text使Oracle9i具備了強(qiáng)大的文本檢索能力和智能化的文本管理能力。Oracle Text是Oracle9i采用的新名稱(chēng),在Oracle8/8i中它被稱(chēng)作Oracle interMedia Text,在Oracle8以前它的名稱(chēng)是Oracle ConText Cartridge。
二、Oracle Text 索引文檔時(shí)所使用的主要邏輯步驟如下:
(1) 數(shù)據(jù)存儲(chǔ)邏輯搜索表的所有行,并讀取列中的數(shù)據(jù)。通常,這只是列數(shù)據(jù),但有些數(shù)據(jù)存儲(chǔ)使用列數(shù)據(jù)作為文檔數(shù)據(jù)的指針。
(2) 過(guò)濾器提取文檔數(shù)據(jù)并將其轉(zhuǎn)換為文本表示方式。存儲(chǔ)二進(jìn)制文檔 (如 Word 或 Acrobat 文件) 時(shí)需要這樣做。過(guò)濾器的輸出不必是純文本格式 -- 它可以是 XML 或 HTML 之類(lèi)的文本格式。
(3) 分段器提取過(guò)濾器的輸出信息,并將其轉(zhuǎn)換為純文本。包括 XML 和 HTML 在內(nèi)的不同文本格式有不同的分段器。轉(zhuǎn)換為純文本涉及檢測(cè)重要文檔段標(biāo)記、移去不可見(jiàn)的信息和文本重新格式化。
(4) 詞法分析器提取分段器中的純文本,并將其拆分為不連續(xù)的標(biāo)記。既存在空白字符分隔語(yǔ)言使用的詞法分析器,也存在分段復(fù)雜的亞洲語(yǔ)言使用的專(zhuān)門(mén)詞法分析器。
(5) 索引引擎提取詞法分析器中的所有標(biāo)記、文檔段在分段器中的偏移量以及被稱(chēng)為非索引字的低信息含量字列表,并構(gòu)建反向索引。倒排索引存儲(chǔ)標(biāo)記和含有這些標(biāo)記的文檔。
三、需要的權(quán)限
要使用Oracle Text,必須具有CTXAPP角色或者是CTXSYS用戶(hù)。Oracle Text為系統(tǒng)管理員提供CTXSYS用戶(hù),為應(yīng)用程序開(kāi)發(fā)人員提供CTXAPP角色。具有CTXAPP角色的用戶(hù)可執(zhí)行以下任務(wù):創(chuàng)建索引,管理 Oracle Text 數(shù)據(jù)字典,包括創(chuàng)建和刪除首選項(xiàng),進(jìn)行Oracle Text 查詢(xún),使用 Oracle Text PL/SQL程序包。
如圖所示:
四、具體的實(shí)現(xiàn)
文本裝入文本列后,就可以創(chuàng)建Oracle Text索引。文檔以許多不同方案、格式和語(yǔ)言存儲(chǔ)。因此,每個(gè) Oracle Text 索引有許多需要設(shè)置的選項(xiàng),以針對(duì)特定情況配置索引。創(chuàng)建索引時(shí),Oracle Text可使用若干個(gè)默認(rèn)值,但在大多數(shù)情況下要求用戶(hù)通過(guò)指定首選項(xiàng)來(lái)配置索引。
每個(gè)索引的許多選項(xiàng)組成功能組,稱(chēng)為"類(lèi)",每個(gè)類(lèi)集中體現(xiàn)配置的某一方面,可以認(rèn)為這些類(lèi)就是與文檔數(shù)據(jù)庫(kù)有關(guān)的一些問(wèn)題。例如:數(shù)據(jù)存儲(chǔ)、過(guò)濾器、詞法分析器、相關(guān)詞表、存儲(chǔ)等。
每個(gè)類(lèi)具有許多預(yù)定義的行為,稱(chēng)之為對(duì)象。每個(gè)對(duì)象是類(lèi)問(wèn)題可能具有的答案,并且大多數(shù)對(duì)象都包含有屬性。通過(guò)屬性來(lái)定制對(duì)象,從而使對(duì)索引的配置更加多變以適應(yīng)于不同的應(yīng)用。
(1)存儲(chǔ)(Storage)類(lèi)
存儲(chǔ)類(lèi)指定構(gòu)成Oracle Text索引的數(shù)據(jù)庫(kù)表和索引的表空間參數(shù)和創(chuàng)建參數(shù)。它僅有一個(gè)基本對(duì)象:BASIC_STORAGE,其屬性包括:I_Index_Clause、I_Table_Clause、K_Table_Clause、N_Table_Clause、P_Table_Clause、R_Table_Clause。
(2)數(shù)據(jù)存儲(chǔ)(Datastore)類(lèi)
數(shù)據(jù)存儲(chǔ):關(guān)于列中存儲(chǔ)文本的位置和其他信息。默認(rèn)情況下,文本直接存儲(chǔ)到列中,表中的每行都表示一個(gè)單獨(dú)的完整文檔。其他數(shù)據(jù)存儲(chǔ)位置包括存儲(chǔ)在單獨(dú)文件中或以其 URL 標(biāo)識(shí)的 Web 頁(yè)上。七個(gè)基本對(duì)象包括:Default_Datastore、Detail_Datastore、Direct_Datastore、File_Datastore、Multi_Column_Datastore 、URL_Datastore、User_Datastore。
(3)文檔段組(Section Group)類(lèi)
文檔段組是用于指定一組文檔段的對(duì)象。必須先定義文檔段,然后才能使用索引通過(guò) WITHIN 運(yùn)算符在文檔段內(nèi)進(jìn)行查詢(xún)。文檔段定義為文檔段組的一部分。包含七個(gè)基本對(duì)象:AUTO_SECTION_GROUP、BASIC_SECTION_GROUP、HTML_SECTION_GROUP、NEWS_SECTION_GROUP、NULL_SECTION_GROUP、XML_SECTION_GROUP、PATH_SECTION_GROUP。
(4)相關(guān)詞表(Wordlist)類(lèi)
相關(guān)詞表標(biāo)識(shí)用于索引的詞干和模糊匹配查詢(xún)選項(xiàng)的語(yǔ)言,只有一個(gè)基本對(duì)象BASIC_WORDLIST,其屬性有:Fuzzy_Match、Fuzzy_Numresults、Fuzzy_Score、Stemmer、Substring_Index、Wildcard_Maxterms、Prefix_Index、Prefix_Max_Length、Prefix_Min_Length。
(5)索引集(Index Set)
索引集是一個(gè)或多個(gè)Oracle 索引 (不是Oracle Text索引) 的集合,用于創(chuàng)建 CTXCAT類(lèi)型的Oracle Text索引,只有一個(gè)基本對(duì)象BASIC_INDEX_SET。
(6)詞法分析器(Lexer)類(lèi)
詞法分析器類(lèi)標(biāo)識(shí)文本使用的語(yǔ)言,還確定在文本中如何標(biāo)識(shí)標(biāo)記。默認(rèn)的詞法分析器是英語(yǔ)或其他西歐語(yǔ)言,用空格、標(biāo)準(zhǔn)標(biāo)點(diǎn)和非字母數(shù)字字符標(biāo)識(shí)標(biāo)記,同時(shí)禁用大小寫(xiě)。包含8個(gè)基本對(duì)象:BASIC_LEXER、CHINESE_LEXER、CHINESE_VGRAM_LEXER、JAPANESE_LEXER、JAPANESE_VGRAM_LEXER、KOREAN_LEXER、KOREAN__MORPH_ LEXER、MULTI_LEXER。
(7)過(guò)濾器(Filter)類(lèi)
過(guò)濾器確定如何過(guò)濾文本以建立索引。可以使用過(guò)濾器對(duì)文字處理器處理的文檔、格式化的文檔、純文本和 HTML 文檔建立索引,包括5個(gè)基本對(duì)象:CHARSET_FILTER、INSO_FILTER INSO、NULL_FILTER、PROCEDURE_FILTER、USER_FILTER。
(8)非索引字表(Stoplist)類(lèi)
非索引字表類(lèi)是用以指定一組不編入索引的單詞 (稱(chēng)為非索引字)。有兩個(gè)基本對(duì)象:BASIC_STOPLIST (一種語(yǔ)言中的所有非索引字) 、 MULTI_STOPLIST (包含多種語(yǔ)言中的非索引字的多語(yǔ)言非索引字表)。
具體操作實(shí)踐
1、 創(chuàng)建詞法分析器及相關(guān)詞表
Begin |
2、 在需要?jiǎng)?chuàng)建全文索引的表中創(chuàng)建索引(索引類(lèi)型必須是 ctxsys.context,即應(yīng)用上下文索引)
create index idx_person_desc on personinfo(persondesc) |
3、進(jìn)行全文索引的同步
exec ctx_ddl.sync_index('idx_user_info', '20M'); |
具體理解
Oracle實(shí)現(xiàn)全文檢索,其機(jī)制其實(shí)很簡(jiǎn)單。即通過(guò)Oracle專(zhuān)利的詞法分析器(lexer),將文章中所有的表意單元(Oracle 稱(chēng)為 term,此處我理解為單詞或者一些有意義的詞語(yǔ)) 找出來(lái),記錄在一組以 dr$開(kāi)頭的表中,同時(shí)記下該term出現(xiàn)的位置、次數(shù)、hash 值等信息。檢索時(shí),Oracle 從這組表中查找相應(yīng)的 term,并計(jì)算其出現(xiàn)頻率,根據(jù)某個(gè)算法來(lái)計(jì)算每個(gè)文檔的得分(score),即所謂的‘匹配率’。而lexer則是該機(jī)制的核心,它決定了全文檢索的效率。Oracle 針對(duì)不同的語(yǔ)言提供了不同的 lexer, 而我們通常能用到其中的三個(gè):
basic_lexer: 針對(duì)英語(yǔ)。它能根據(jù)空格和標(biāo)點(diǎn)來(lái)將英語(yǔ)單詞從句子中分離,還能自動(dòng)將一些出現(xiàn)頻率過(guò)高已經(jīng)失去檢索意義的單詞作為‘垃圾’處理,如if , is 等,具有較高的處理效率。但該lexer應(yīng)用于漢語(yǔ)則有很多問(wèn)題,由于它只認(rèn)空格和標(biāo)點(diǎn),而漢語(yǔ)的一句話(huà)中通常不會(huì)有空格,因此,它會(huì)把整句話(huà)作為一個(gè)term,事實(shí)上失去檢索能力。以‘中國(guó)人民站起來(lái)了’這句話(huà)為例,basic_lexer 分析的結(jié)果只有一個(gè)term ,就是‘中國(guó)人民站起來(lái)了’。此時(shí)若檢索‘中國(guó)’,將檢索不到內(nèi)容。
chinese_vgram_lexer: 專(zhuān)門(mén)的漢語(yǔ)分析器,支持所有漢字字符集。該分析器按字為單元來(lái)分析漢語(yǔ)句子?!袊?guó)人民站起來(lái)了&r
關(guān)鍵詞標(biāo)簽:Oracle,數(shù)據(jù)庫(kù)
相關(guān)閱讀
熱門(mén)文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類(lèi)型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語(yǔ)句修改字段類(lèi)型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法