李瑞麗,錢(qián) 皓,黃以凱
隨著現(xiàn)代信息科技的不斷發(fā)展,如何較快較好的實(shí)現(xiàn)全文檢索已成為比較熱門(mén)的話題。全文檢索是指將文件中所有的文本與檢索的關(guān)鍵字進(jìn)行匹配的一個(gè)資料檢索方法。全文檢索技術(shù)是指通過(guò)關(guān)鍵字將存儲(chǔ)在信息系統(tǒng)數(shù)據(jù)庫(kù)中,包括該關(guān)鍵字的所有記錄查找出來(lái)的檢索技術(shù),可以獲得信息文本中的所有相關(guān)章、段、節(jié)、句、詞等信息,同時(shí)也可以對(duì)信息進(jìn)行各種統(tǒng)計(jì)和分析。
本文將介紹如何使用 Oracle的全文檢索技術(shù)提供一個(gè)優(yōu)秀快速的解決方案。在已有的信息系統(tǒng)中,利用Oracle text和Ultra Search實(shí)現(xiàn)對(duì)不同格式數(shù)據(jù)源,尤其是以LOB類(lèi)型(word、excel、pdf等二進(jìn)制格式的文件)保存的數(shù)據(jù)的全文檢索,并且解決了因系統(tǒng)中間件和Ultra Search中間件不同帶來(lái)的權(quán)限控制問(wèn)題。
外事一體化綜合管理系統(tǒng)(課題編號(hào):09511503500,以下簡(jiǎn)稱外事系統(tǒng))是由上海市護(hù)照簽證受理中心、萬(wàn)達(dá)信息股份有限公司共同承擔(dān)的研發(fā)課題。外事系統(tǒng)設(shè)計(jì)開(kāi)發(fā)了諸如來(lái)華簽證、領(lǐng)事認(rèn)證、辦公審批等20多個(gè)子系統(tǒng)。各個(gè)子系統(tǒng)既有獨(dú)立性,也有關(guān)聯(lián)性,業(yè)務(wù)數(shù)據(jù)表近200張,有些數(shù)據(jù)表的數(shù)據(jù)達(dá)到數(shù)十萬(wàn)級(jí),且各種格式的附件存儲(chǔ)在LOB字段中,要求系統(tǒng)能夠提供準(zhǔn)確而快捷的全文檢索功能。因此如何實(shí)現(xiàn)基于大數(shù)據(jù)量的全文檢索是外事系統(tǒng)的一大技術(shù)難題。
Oracle text是Oracle10g的組件,基于后臺(tái)數(shù)據(jù)庫(kù),是一種強(qiáng)大的檢索工具,搜索范圍可以是多種文本格式的數(shù)據(jù)來(lái)源,可對(duì)Oracle數(shù)據(jù)支持的多種語(yǔ)言實(shí)現(xiàn)全文檢索功能。
Oracle Text實(shí)現(xiàn)全文檢索的邏輯步驟主要包括如下:
(1)搜索檢索目標(biāo)數(shù)據(jù)庫(kù)中的所有表源,并讀取所有表源列中的數(shù)據(jù)。
(2)通過(guò)過(guò)濾器過(guò)濾文檔數(shù)據(jù)并將文檔數(shù)據(jù)轉(zhuǎn)換為文本表示方式。
(3)通過(guò)分段器提取過(guò)濾器的輸出的文檔信息,并將該文檔信息轉(zhuǎn)換為純文本。
(4)通過(guò)詞法分析器提取分段器中輸出的純文本信息,并將該純文本信息拆分為不連續(xù)的標(biāo)記。
(5)通過(guò)索引引擎提取詞法分析器中的輸出的所有不連續(xù)的標(biāo)記,并構(gòu)建索引。
Oracle Text為系統(tǒng)管理員分配CTXSYS角色,為應(yīng)用程序開(kāi)發(fā)人員分配CTXAPP角色。CTXSYS角色的用戶可啟動(dòng)Oracle Text服務(wù)器,并執(zhí)行CTXAPP角色下的所有任務(wù)。CTXAPP角色的用戶可創(chuàng)建索引,管理 Oracle Text 數(shù)據(jù)字典,執(zhí)行Oracle Text 查詢,使用 Oracle Text PL/SQL程序包。
Oracle Text的使用步驟歸納起來(lái)如下:
(1)建表并裝載文本。如:
(2)配置索引。
(3)建立索引。如:
(4)發(fā)出查詢。如:
(5)索引維護(hù):同步與優(yōu)化
Oracle Text可為不同格式存儲(chǔ)方式的文本文檔配置索引,這些索引的選項(xiàng)組成功能組,被稱為“類(lèi)”。Oracle Text的主要類(lèi)包括存儲(chǔ)(Storage)類(lèi)、數(shù)據(jù)存儲(chǔ)(Datastore)類(lèi) 、文檔段組(Section Group)類(lèi)、相關(guān)詞表(Wordlist)類(lèi)、索引集(Index Set)、詞法分析器(Lexer)類(lèi)、過(guò)濾器(Filter)類(lèi)等。
Ultra Search是Oracle的附加功能模塊,與其它搜索引擎工具的技術(shù)構(gòu)架類(lèi)似。Ultra Search提供了六種搜索數(shù)據(jù)源,常見(jiàn)的為:
(1)Web源:指由網(wǎng)站發(fā)布更新的內(nèi)容,包括圖片、音頻、視頻等資源。
(2)文件源:指可訪問(wèn)的機(jī)器上所有文檔集,包括word、excel、pdf等各種類(lèi)型在內(nèi)的多種常見(jiàn)格式的文件。
(3)電子郵件源:指發(fā)送到特定郵件地址的郵件信息。
(4)表源:指來(lái)源于數(shù)據(jù)庫(kù)表信息的數(shù)據(jù)源,可建立多個(gè)任意新表源。
Ultra Search是為用戶提供友好界面的搜索工具,與Oracle Text有相同的公共接口,在聚集信息的索引、轉(zhuǎn)換查詢上增加了專門(mén)技術(shù),因此相對(duì)于Oracle Text來(lái)說(shuō),Ultra Search查詢性能質(zhì)量更高,可擴(kuò)展性更優(yōu)化。Oracle Text與Oracle數(shù)據(jù)庫(kù)的高度集成,實(shí)現(xiàn)了Ultra Search與動(dòng)態(tài)數(shù)據(jù)的自由交互。
Ultra Search由3個(gè)組件組成:
(1)服務(wù)器組件 :包括Ultra Search資料庫(kù)、Oracle Text和遠(yuǎn)程Crawler。
(2)Crawler :收集信息,并對(duì)這些信息建立索引的過(guò)程。
(3)中間層組件 :包括Java查詢應(yīng)用程序接口、JSP查詢應(yīng)用程序、Java電子郵件應(yīng)用程序接口和管理工具。
Ultra Search與Oracle Text的高度集成能夠快速便捷的實(shí)現(xiàn)全文檢索功能,但是當(dāng)與應(yīng)用系統(tǒng)相結(jié)合時(shí)中則存在一些不足之處:(1)由于Ultra Search本身是一個(gè)應(yīng)用系統(tǒng),基于oracle的中間件oc4j,而一般的應(yīng)用系統(tǒng)則基于一些其他的中間件,如Weblogic等;(2)如何能使Ultra Search與應(yīng)用系統(tǒng)更好的實(shí)現(xiàn)兼容,并實(shí)現(xiàn)權(quán)限控制,是本文討論的重點(diǎn)。本文基于外事系統(tǒng)上對(duì)如何實(shí)現(xiàn) Ultra Search和Oracle Text的全文檢索功能進(jìn)行討論與設(shè)計(jì)。
本文在Oracle組件Ultra Search和Oracle Text的基礎(chǔ)上進(jìn)行改進(jìn),給出了基于大數(shù)據(jù)的外事系統(tǒng)全文檢索的一個(gè)簡(jiǎn)單快速的實(shí)現(xiàn)方式。系統(tǒng)結(jié)構(gòu)設(shè)計(jì),如圖1所示:
圖1 系統(tǒng)結(jié)構(gòu)圖
外事系統(tǒng)與實(shí)現(xiàn)全文檢索功能的Ultra Search和Oracle Text是相對(duì)獨(dú)立的系統(tǒng),使用不同的中間件 Weblogic和Oracle 的 OC4J。Ultra Search是基于 Oracle Text和 OC4J的一個(gè)客戶端程序。在系統(tǒng)中,我們用Oracle Text創(chuàng)建外事系統(tǒng)檢索所需的表源(Table Source)和查詢組(Source Group),每一個(gè)業(yè)務(wù)數(shù)據(jù)表對(duì)應(yīng)一個(gè) Table Source,同一個(gè)模塊功能的Table Source組成一個(gè)Source Group,此時(shí)生成的Table Source和Source Group保存在Oracle數(shù)據(jù)庫(kù)中的wksys.wk$_data_source和wksys.wk$_source_group表中。
在 Ultra Search客戶端程序中可對(duì) wksys.wk$_data_source和wksys.wk$_source_group表進(jìn)行維護(hù)。在建立Table Source時(shí),需要區(qū)分不同格式類(lèi)型數(shù)據(jù)的索引存儲(chǔ)方式,如VARCHAR2、CLOB數(shù)據(jù)對(duì)應(yīng)的索引類(lèi)型Plain Text,BLOB數(shù)據(jù)對(duì)應(yīng)的索引類(lèi)型為Binary等。
由于應(yīng)用系統(tǒng)中需要檢索的業(yè)務(wù)表與字段數(shù)量可能會(huì)比較多,手工建立這些table source與group會(huì)占用開(kāi)發(fā)人員比較多的時(shí)間,為了提高開(kāi)發(fā)效率,本文用sql腳本建立table source與table group。
(1)系統(tǒng)中針對(duì)每個(gè)字段建立索引,例如:'zh','BINARY',''為創(chuàng)建 Table Source的所有參數(shù),CASE_ATTACH_BL_ATTACH_CONTENT為T(mén)able Source名稱,oa為對(duì)其創(chuàng)建索引的表空間名稱,CASE_ATTACH為創(chuàng)建索引的表源,BL_ATTACH_CONTENT為創(chuàng)建索引的字段,NM_ATTACH_ID 為主鍵名稱,ST_ATTACH_NAME為檢索結(jié)果顯示的標(biāo)題字段。當(dāng)腳本準(zhǔn)備完全后,通過(guò)執(zhí)行wd_create_datasource來(lái)創(chuàng)建所有的table source。
(2)同一模塊作為一個(gè)查詢組,例如:
(3)制定檢索方案:當(dāng)Table Source與Source Group創(chuàng)建后,制定檢索方案,由于應(yīng)用系統(tǒng)用戶比較多,如在辦公時(shí)間創(chuàng)建索引,可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)性能下降,因此創(chuàng)建索引并不是同步的,在第一次創(chuàng)建索引之后,我們選擇在每天19:00點(diǎn)之后開(kāi)始增量索引。當(dāng)索引創(chuàng)建完就可以在查詢頁(yè)面對(duì)系統(tǒng)進(jìn)行檢索了。
索引創(chuàng)建完成后,可在Ultra Search的檢索頁(yè)面對(duì)系統(tǒng)進(jìn)行檢索,但此時(shí)的檢索結(jié)果沒(méi)有任何權(quán)限的判斷,針對(duì)外事系統(tǒng)的業(yè)務(wù)需求,每個(gè)處室只可查詢自己處室的數(shù)據(jù),各處室有權(quán)限的模塊也不同,具有特殊角色的人員除外(如系統(tǒng)管理員)。如何實(shí)現(xiàn)對(duì)檢索結(jié)果的權(quán)限、模塊、角色控制以及,查看檢索結(jié)果的詳情也是本文的一個(gè)難點(diǎn)。
本文給出了一個(gè)解決方式,如圖2所示:
圖2 檢索流程圖
用戶在外事系統(tǒng)門(mén)戶中的檢索流程如上圖所示,主要的涉及的業(yè)務(wù)表如下:
(1)創(chuàng)建模塊與查詢組對(duì)應(yīng)關(guān)系表,如下:
檢索結(jié)果中只能顯示查詢用戶所擁有模塊的數(shù)據(jù)。當(dāng)用戶從應(yīng)用系統(tǒng)門(mén)戶中進(jìn)行檢索時(shí),首先在后臺(tái)代碼中拿到該用戶的所有模塊MODULE_ID,將其組裝成一個(gè)結(jié)果集傳遞到Ultra Search的系統(tǒng)中,通過(guò)MODULE_ID集合找到所對(duì)應(yīng)的所有的 GROUP_ID,針對(duì)這些查詢組進(jìn)行檢索,從而實(shí)現(xiàn)了用戶的模塊權(quán)限的控制。
(2)創(chuàng)建url模板與目標(biāo)action對(duì)應(yīng)關(guān)系表,如下:
用戶所擁有模塊的數(shù)據(jù)不一定都有查看權(quán)限,如何屏蔽掉那些沒(méi)有查看權(quán)限的數(shù)據(jù),是該系統(tǒng)的一個(gè)最大難點(diǎn)。在建立Table Source時(shí),參數(shù)pv_value記錄的是檢索結(jié)果中用于顯示的 Url鏈接,通過(guò)此鏈接可打開(kāi)數(shù)據(jù)詳情頁(yè)面。url中記錄的數(shù)據(jù)主鍵id、標(biāo)題字段、類(lèi)型字段等其他信息,通過(guò)ULTRA_URL_MAP_ACTION表,在點(diǎn)擊檢索結(jié)果的標(biāo)題時(shí),首先跳轉(zhuǎn)到應(yīng)用系統(tǒng)中,獲取url 的鏈接,從中拆分出 action 作 為 ORIGINAL_ACTION, 通 過(guò)ORIGINAL_ACTION 找 到 PERM_ACTION, 在PERM_ACTION中,將核對(duì)用戶是否有該數(shù)據(jù)的查看權(quán)限,如果有則通過(guò)ORIGINAL_ACTION查看,否則顯示“無(wú)權(quán)限查看!”。系統(tǒng)中會(huì)存在不同類(lèi)型的業(yè)務(wù)數(shù)據(jù)放在同一個(gè)業(yè)務(wù)表中,需要根據(jù) URL_TYPE找到不同的TARGET_ACTION。
由于Ultra Search檢索中的標(biāo)題字段拿不到,把業(yè)務(wù)表中的標(biāo)題字段放在檢索結(jié)果的url中,在檢索結(jié)果頁(yè)面將其拆分出來(lái)作為標(biāo)題字段即可達(dá)到理想的效果。檢索結(jié)果頁(yè)面中信息來(lái)源顯示的都是英文的查詢組名稱,用戶體驗(yàn)性不是太好,因此我們通過(guò)GROUP_ID 在ultra_module_map_group表中找到對(duì)應(yīng)的 MODULE_NAME作為來(lái)源顯示在檢索結(jié)果頁(yè)面中。
檢索頁(yè)面的使用方式與搜索引擎網(wǎng)站的檢索操作方式習(xí)慣相似。檢索結(jié)果中暫時(shí)排除格式為圖片或者掃描版的數(shù)據(jù)信息。多個(gè)檢索關(guān)鍵字可由“+”、“-”、空格、雙引號(hào)等特殊符號(hào)組合。“+”、“-”號(hào)必須為英文輸入法。“+”代表必須包含;“-”代表不包含;空格代表“或”等。如果查詢的詞語(yǔ)中間包含空格,查詢時(shí)需要加引號(hào)。
本文以外事系統(tǒng)為例,介紹了基于Ultra Search與Oracle Text實(shí)現(xiàn)全文檢索的一種快速、高效的解決方案。在不用改變?cè)袘?yīng)用系統(tǒng)的基礎(chǔ)上,獨(dú)立實(shí)現(xiàn)全文檢索,大大減少了應(yīng)用系統(tǒng)風(fēng)險(xiǎn)。解決了因不同的中間件帶來(lái)了用戶權(quán)限與模塊控制的難題,同時(shí)也提高了系統(tǒng)集成的靈活性和可擴(kuò)展性,實(shí)現(xiàn)了更好的業(yè)務(wù)過(guò)程控制,提高了用戶檢索的效率和速度,滿足了客戶的業(yè)務(wù)需求。
[1]Oracle(R) Text Application Developer's Guide 10g Release 1 (10.1)[C][Part Number B10729-01].
[2]Oracle Text-An Oracle Technical [M]White Pater 2001.
[3]Oracle Text Reference Book 2001.
[4]Jie Lu;Jamie Callan User Modeling for Full-Text Federated Search in Peer-to-peer [M]Networks 2006
[5]范鵬.基于Oracle Text的信息系統(tǒng)資料庫(kù)全文檢索技術(shù), [J]《通信與計(jì)算技術(shù)》,2006年第2期
[6]蒙輝;陳燕 Orade Text技術(shù)在復(fù)雜結(jié)構(gòu)數(shù)據(jù)庫(kù)中的應(yīng)用 [期刊論文]-[J]計(jì)算機(jī)技術(shù)與發(fā)展2007(04)
[7]熊志輝.王德鑫.王煒.張茂軍 基于Oracle的多權(quán)限多格式文檔組織與檢索系統(tǒng) [期刊論文]-[J]計(jì)算機(jī)應(yīng)用2008(9)
[8]李尚初.Oracle的全文檢索技術(shù), [J]哈爾濱師范大學(xué)自然科學(xué)學(xué)報(bào),2009年第4期
[9]羅玉梅.Oracle全文檢索技術(shù)的應(yīng)用, [J]電子商務(wù),2010年第8期