国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種針對(duì)海量數(shù)據(jù)全文檢索場(chǎng)景的實(shí)現(xiàn)方法與流程

      文檔序號(hào):11155210閱讀:539來源:國(guó)知局
      本發(fā)明涉及海量數(shù)據(jù)全文檢索領(lǐng)域,具體涉及一種針對(duì)海量數(shù)據(jù)全文檢索場(chǎng)景的實(shí)現(xiàn)方法。
      背景技術(shù)
      ::在當(dāng)今信息爆炸的時(shí)代,每個(gè)單位或個(gè)人都在為信息的快速增長(zhǎng)做出了各種貢獻(xiàn)。信息的種類也在不斷的擴(kuò)展,越來越多的非結(jié)構(gòu)化信息不斷出現(xiàn),包括企業(yè)的各種報(bào)表、帳單、電子文檔、網(wǎng)站的各種元素、圖片、傳真、掃描影像,以及大量的多媒體的音頻、視頻信息等等。所有的存儲(chǔ)數(shù)據(jù)中,有85%采用的是非結(jié)構(gòu)化格式的,非結(jié)構(gòu)化信息每三個(gè)月增長(zhǎng)一倍。由于信息格式的差異很大,所以基本無法整合為統(tǒng)一的接口以方便使用。而全文檢索技術(shù),就是以數(shù)據(jù)諸如文字,聲音,圖像等為主要內(nèi)容,以檢索文獻(xiàn)資料的內(nèi)容而不是外表特征的一種檢索技術(shù)。Lucene是開放源代碼的全文搜索引擎工具包,憑借著其強(qiáng)勁的搜索功能和簡(jiǎn)單易用的實(shí)現(xiàn),在國(guó)內(nèi)外已經(jīng)很普及,甚至一度出現(xiàn)了言搜索必稱Lucene的盛景。但是任何一個(gè)軟件,包括所有偉大的軟件都有這樣或者那樣的“缺點(diǎn)”和各自適用的領(lǐng)域,Lucene也不例外。首先,Lucene的內(nèi)建不支持群集,Lucene是作為嵌入式的工具包的形式出現(xiàn)的,在核心代碼上沒有提供對(duì)群集的支持。如何利用Lucene來進(jìn)行全文檢索以提高檢索性能需要研究一種可行方案。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供了一種可以在海量數(shù)據(jù)平臺(tái)下實(shí)現(xiàn)全文檢索的方法,基于Lucene來進(jìn)行全文檢索以提高檢索性能。本發(fā)明提供的針對(duì)海量數(shù)據(jù)全文檢索場(chǎng)景的實(shí)現(xiàn)方法,在檢索引擎對(duì)輸入的SQL語句分析后形成執(zhí)行計(jì)劃樹,將執(zhí)行計(jì)劃樹切割成執(zhí)行單元fragment,通過協(xié)調(diào)器分發(fā)到節(jié)點(diǎn)上執(zhí)行并返回結(jié)果。本發(fā)明將Lucene引入檢索引擎,對(duì)集群中已經(jīng)存在的數(shù)據(jù)文件建立Lucene索引文件。一個(gè)數(shù)據(jù)文件對(duì)應(yīng)有一個(gè)或多個(gè)Lucene索引文件,一個(gè)Lucene索引文件存儲(chǔ)在一個(gè)節(jié)點(diǎn)上,在每個(gè)存儲(chǔ)Lucene索引文件的節(jié)點(diǎn)上,設(shè)置有一個(gè)守護(hù)進(jìn)程對(duì)該節(jié)點(diǎn)的Lucene索引文件進(jìn)行維護(hù),保持Lucene索引文件與RCFile文件的一致性。后面說明中,Lucene索引文件可簡(jiǎn)稱為L(zhǎng)ucene文件。具體地,本發(fā)明的檢索通過如下幾方面進(jìn)行改進(jìn)。第一方面,優(yōu)化協(xié)調(diào)器對(duì)fragment的調(diào)度機(jī)制。在一個(gè)fragment中,有一個(gè)結(jié)構(gòu)體range,range中記載有Lucene索引文件地址列表;在檢索時(shí),遍歷所有fragment中的range,對(duì)每個(gè)range,獲取該range對(duì)應(yīng)的Lucene索引文件地址列表。對(duì)列表中的每個(gè)Lucene索引文件地址,執(zhí)行過程(1)和(2):(1)判斷該地址是否位于所執(zhí)行的fragment的本地節(jié)點(diǎn)上,若是,則設(shè)置該索引文件所在節(jié)點(diǎn)的預(yù)加值A(chǔ)為1,若不是,設(shè)置該索引文件所在節(jié)點(diǎn)的預(yù)加值A(chǔ)為設(shè)定的固定最大值;(2)將該索引文件所在節(jié)點(diǎn)的當(dāng)前計(jì)數(shù)B,加上預(yù)加值A(chǔ),得到新的計(jì)數(shù)值C。每個(gè)節(jié)點(diǎn)的計(jì)數(shù)值初始設(shè)置為0。在得到該range的每個(gè)Lucene索引文件所在節(jié)點(diǎn)的計(jì)數(shù)C后,選擇其中計(jì)數(shù)C最小的節(jié)點(diǎn),作為該range的執(zhí)行節(jié)點(diǎn),然后更新該節(jié)點(diǎn)的當(dāng)前計(jì)數(shù)B為對(duì)應(yīng)的計(jì)數(shù)值C,標(biāo)記該range將最終在該節(jié)點(diǎn)上執(zhí)行。第二方面,優(yōu)化全文讀取引擎機(jī)制。節(jié)點(diǎn)執(zhí)行一個(gè)fragment時(shí),若對(duì)應(yīng)的Lucene索引文件在本地節(jié)點(diǎn),直接通過JNI調(diào)用Lucene接口,獲取檢索結(jié)果集;若對(duì)應(yīng)的Lucene索引文件在遠(yuǎn)程節(jié)點(diǎn),調(diào)用socket接口通過遠(yuǎn)程tcp訪問遠(yuǎn)程節(jié)點(diǎn)的Lucene接口,獲取檢索結(jié)果集;socket接口還用于RCFile與Lucene中元數(shù)據(jù)變化時(shí)的更新;JNI表示Java本地接口,tcp表示傳輸控制協(xié)議。若調(diào)用訪問Lucene接口時(shí),對(duì)應(yīng)節(jié)點(diǎn)上維護(hù)Lucene索引文件的守護(hù)進(jìn)程已經(jīng)掛掉,或遠(yuǎn)程tcp連接無法建立時(shí),則執(zhí)行節(jié)點(diǎn)直接選擇讀取RCFile文件;若讀取Lucene索引文件出錯(cuò)時(shí),執(zhí)行節(jié)點(diǎn)重新調(diào)用該Lucene索引文件對(duì)應(yīng)的RCFile文件,重新進(jìn)行檢索。本發(fā)明的針對(duì)海量數(shù)據(jù)全文檢索場(chǎng)景的實(shí)現(xiàn)方法,還包括如下方面:第三方面,實(shí)現(xiàn)全文檢索的相關(guān)度排序;相關(guān)度的排序通過設(shè)置權(quán)重實(shí)現(xiàn)。在檢索某個(gè)字段時(shí),給該字段設(shè)置權(quán)重,在Lucene檢索時(shí),將權(quán)重加入字段中,檢索返回根據(jù)權(quán)值排序的結(jié)果數(shù)據(jù),將各Lucene檢索的結(jié)果數(shù)據(jù)匯總并根據(jù)權(quán)重再進(jìn)行一次排序,最后將符合以相關(guān)度排序的數(shù)據(jù)結(jié)果集返回給用戶。在檢索時(shí),若是分組數(shù)據(jù),對(duì)分組數(shù)據(jù)的權(quán)重值先進(jìn)行融合計(jì)算,再按照融合后的權(quán)重值,對(duì)分組數(shù)據(jù)進(jìn)行相關(guān)度的排序。本發(fā)明提供的針對(duì)海量數(shù)據(jù)全文檢索場(chǎng)景的實(shí)現(xiàn)方法,其優(yōu)點(diǎn)和積極效果在于:(1)本發(fā)明實(shí)現(xiàn)在全文檢索或條件字段檢索時(shí),使用Lucene文件進(jìn)行數(shù)據(jù)讀取,相對(duì)于現(xiàn)有檢索采用的RCFile文件,不需遍歷整個(gè)文件一次,極大地提升了檢索性能。(2)通過優(yōu)化協(xié)調(diào)器中對(duì)fragment的調(diào)度機(jī)制,讓某一個(gè)節(jié)點(diǎn)不會(huì)因?yàn)閳?zhí)行過多的range而過多地消耗資源,并盡可能保證執(zhí)行本地讀寫,實(shí)現(xiàn)檢索效率的保證,同時(shí)也能保證節(jié)點(diǎn)的負(fù)載相對(duì)比較均衡,同時(shí)能合理地利用集群的資源。(3)本發(fā)明在進(jìn)行全文檢索時(shí),首先調(diào)用Lucene進(jìn)行檢索,若訪問Lucene出現(xiàn)問題時(shí)調(diào)用RCFile檢索,保證檢索的持續(xù)性和正確性。附圖說明圖1為本發(fā)明進(jìn)行檢索的整體流程示意圖;圖2為本發(fā)明的協(xié)調(diào)器對(duì)fragment進(jìn)行調(diào)度處理的流程示意圖;圖3為本發(fā)明的全文讀取引擎處理流程圖;圖4為本發(fā)明的相關(guān)度排序處理流程圖。具體實(shí)施方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的技術(shù)方案作進(jìn)一步詳細(xì)說明?,F(xiàn)有海量數(shù)據(jù)進(jìn)行檢索時(shí),默認(rèn)使用的是RCFile做為數(shù)據(jù)存儲(chǔ)文件格式。RCFile是Hive推出的一種專門面向列的數(shù)據(jù)格式,是一種基于行列混合存儲(chǔ)的優(yōu)秀存儲(chǔ)格式,滿足了快速數(shù)據(jù)加載和動(dòng)態(tài)負(fù)載高適應(yīng)的需求。它遵循“先按列劃分,再垂直劃分”的設(shè)計(jì)理念。當(dāng)查詢過程中,針對(duì)它并不關(guān)心的列時(shí),它會(huì)在IO上跳過這些列。需要說明的是,RCFile并不是真正直接跳過不需要的列,并跳到需要讀取的列,而是通過掃描每一個(gè)rowgroup的頭部定義來實(shí)現(xiàn)的,在整個(gè)Block級(jí)別的頭部并沒有定義每個(gè)列從哪個(gè)rowgroup起始到哪個(gè)rowgroup結(jié)束。在讀取RCFile文件時(shí),若檢索的只是部分?jǐn)?shù)據(jù)時(shí),也要遍歷文件內(nèi)容,然后才能根據(jù)相關(guān)算法得到相關(guān)數(shù)據(jù)。因此,在海量數(shù)據(jù)掃描時(shí),由于RCFile文件檢索是線性的,檢索性能相對(duì)比較費(fèi)時(shí)。而Lucene存儲(chǔ)介質(zhì)對(duì)文件按一定條件切割,Lucene文件是根據(jù)索引直接讀取對(duì)應(yīng)內(nèi)容,不用遍歷整體文件,從效率上來說,檢索速率會(huì)有一定的提高,會(huì)高于直接線性讀取文件。性能提升場(chǎng)景有:1.等值查詢:類似select*fromtblwherea=1;select*fromtblwhereain(1,2,3);2.模糊查詢:類似select*fromtblwhereblike‘value%’;3.正則查詢:類似select*fromtblwherebrlike‘/value[a]/’;4.計(jì)數(shù)查詢(count):類似selectcount(*)fromtblwherea>1;上面,tbl表示文件名稱,a、b表示查詢字段,value表示查詢字符。檢索引擎進(jìn)行檢索的整體流程,如圖1所示。檢索引擎在用戶輸入相關(guān)查詢語句后,使用基于SQL語言進(jìn)行相關(guān)字段的檢索。其次對(duì)SQL語句分析,分析語句詞法語法,分析檢索語義,根據(jù)對(duì)應(yīng)文件信息的元數(shù)據(jù)和語法分析結(jié)果,形成執(zhí)行計(jì)劃樹。然后,把執(zhí)行計(jì)劃樹切割成具體的執(zhí)行單元:fragment;通過協(xié)調(diào)器,把對(duì)應(yīng)fragment分發(fā)到具體的節(jié)點(diǎn)上執(zhí)行并返回結(jié)果。協(xié)調(diào)器會(huì)根據(jù)具體的文件分布情況及節(jié)點(diǎn)使用情況,動(dòng)態(tài)分配執(zhí)行節(jié)點(diǎn),之后會(huì)把任務(wù)提交給每一個(gè)執(zhí)行節(jié)點(diǎn)的讀取引擎,讀取對(duì)應(yīng)的底層Lucene文件。最后把各個(gè)節(jié)點(diǎn)返回的結(jié)果匯總到協(xié)調(diào)器,返回最終結(jié)果給用戶。所述的節(jié)點(diǎn)是指存儲(chǔ)集群中的計(jì)算機(jī)、服務(wù)器等存儲(chǔ)數(shù)據(jù)、處理數(shù)據(jù)的設(shè)備節(jié)點(diǎn)。本發(fā)明提供的針對(duì)海量數(shù)據(jù)全文檢索場(chǎng)景的實(shí)現(xiàn)方法,主要改進(jìn)之處在于:(1)在協(xié)調(diào)階段對(duì)調(diào)度機(jī)制的優(yōu)化;(2)全文數(shù)據(jù)讀取引擎部分的優(yōu)化;(3)實(shí)現(xiàn)全文檢索的結(jié)果數(shù)據(jù)的相關(guān)性排序。下面分別說明各改進(jìn)方面。本發(fā)明的第一方面,優(yōu)化fragment的調(diào)度機(jī)制。在每一個(gè)fragment中,一個(gè)最小的文件讀取單元用一個(gè)結(jié)構(gòu)體range來描述,該range會(huì)記錄該文件所在節(jié)點(diǎn)列表,因?yàn)閺?fù)本的存在。基本的調(diào)度原則是,可以讓每一個(gè)range盡可能平均地分布在不同的節(jié)點(diǎn)上,不會(huì)讓某一個(gè)節(jié)點(diǎn)因?yàn)閳?zhí)行過多的range而過多地消耗資源。所以,在協(xié)調(diào)器階段時(shí),會(huì)根據(jù)所有range的總量,計(jì)算某一個(gè)節(jié)點(diǎn)已經(jīng)執(zhí)行的range的數(shù)目,每次選擇節(jié)點(diǎn)時(shí),會(huì)選擇使用量最小的節(jié)點(diǎn),作為執(zhí)行節(jié)點(diǎn)。同時(shí),為了執(zhí)行的速度,若該節(jié)點(diǎn)一旦要遠(yuǎn)程訪問時(shí),則執(zhí)行的節(jié)點(diǎn)計(jì)數(shù)會(huì)給一個(gè)很大的值,以保證盡可能執(zhí)行本地讀寫。既保證了檢索的效率,同時(shí)也能保證節(jié)點(diǎn)的負(fù)載相對(duì)比較均衡,同時(shí)能合理地利用集群的資源。執(zhí)行計(jì)劃樹是由一系列的fragment組成,每個(gè)fragment是執(zhí)行計(jì)劃樹的最小執(zhí)行單元,最后在每個(gè)節(jié)點(diǎn)上執(zhí)行的就是一個(gè)或多個(gè)fragment。每個(gè)fragment有自己獨(dú)立的處理數(shù)據(jù)的操作,如讀取數(shù)據(jù)、執(zhí)行對(duì)應(yīng)函數(shù),fragment之間是通過RPC(RemoteProcedureCallProtocol,遠(yuǎn)程過程調(diào)用協(xié)議)實(shí)現(xiàn)數(shù)據(jù)傳輸,最終匯總給用戶。在讀取文件的fragment中,會(huì)有一個(gè)結(jié)構(gòu)體range描述一個(gè)數(shù)據(jù)文件的所有存儲(chǔ)節(jié)點(diǎn)host、名字和讀取大小,一個(gè)range對(duì)應(yīng)一個(gè)數(shù)據(jù)文件。Range中記錄有RCFile和Lucene文件的信息,RCFile的信息包括:文件名、文件地址列表、文件大小、是否創(chuàng)建Lucene文件、文件狀態(tài)等;Lucene文件信息包括:文件名、文件地址列表、文件大小、文件狀態(tài)等。原始流程中,因?yàn)閺?fù)本的存在,所以一個(gè)數(shù)據(jù)文件可能會(huì)存在不同的節(jié)點(diǎn)上。而本發(fā)明對(duì)一個(gè)原始數(shù)據(jù)文件做Lucene索引操作時(shí),會(huì)保證Lucene能均衡地分布在整個(gè)存儲(chǔ)集群中,因?yàn)樽侄谓M合的不同,在對(duì)一個(gè)數(shù)據(jù)文件建立Lucene索引時(shí),可能會(huì)生成含有檢索字段的多個(gè)Lucene索引文件,而這些Lucene索引文件也會(huì)分布在多個(gè)節(jié)點(diǎn)上。所以,為了讓檢索能在保障效率的基礎(chǔ)上最大化的使用集群,需要對(duì)檢索的執(zhí)行節(jié)點(diǎn)進(jìn)行協(xié)調(diào)。所以,檢索時(shí),會(huì)遍歷整個(gè)fragment中的range,調(diào)整每個(gè)fragment的執(zhí)行位置,對(duì)每一個(gè)執(zhí)行節(jié)點(diǎn)進(jìn)行計(jì)數(shù)判斷,選擇一個(gè)計(jì)數(shù)最小的節(jié)點(diǎn),作為該fragment的執(zhí)行節(jié)點(diǎn)。本發(fā)明的協(xié)調(diào)器對(duì)fragment的調(diào)度機(jī)制的流程如圖2所示。在一次檢索中,首先循環(huán)查找所有的fragment,找到一個(gè)range,獲取該range對(duì)應(yīng)的Lucene索引文件地址列表。根據(jù)該range中的Lucene索引文件地址列表,選擇一個(gè)Lucene索引文件地址,先判定該索引文件地址是否在所執(zhí)行的fragment的本地節(jié)點(diǎn)上,確定索引文件所在節(jié)點(diǎn)的預(yù)加值A(chǔ)。本地節(jié)點(diǎn)執(zhí)行引擎在獲取到執(zhí)行任務(wù)后,將生成一個(gè)執(zhí)行列表,若當(dāng)前訪問的文件存在該執(zhí)行列表中,并且該文件存儲(chǔ)在本地節(jié)點(diǎn),即認(rèn)為是本地訪問模式,否則認(rèn)為是遠(yuǎn)程訪問。若不在本地節(jié)點(diǎn),則在訪問該索引時(shí),會(huì)導(dǎo)致一次遠(yuǎn)程查詢,無疑是比較費(fèi)時(shí)的,所以該索引所在節(jié)點(diǎn)host的預(yù)設(shè)值A(chǔ)為一個(gè)設(shè)定的固定最大值,實(shí)際操作中該值可設(shè)置為max(int64)。若在本地節(jié)點(diǎn),此時(shí)該索引的訪問則是對(duì)本節(jié)點(diǎn)內(nèi)部資源的訪問,此時(shí)設(shè)置該索引文件所在節(jié)點(diǎn)host的預(yù)加值A(chǔ)為1。將該索引所在節(jié)點(diǎn)的當(dāng)前計(jì)數(shù)B,加上設(shè)置的預(yù)加值A(chǔ),得到新的計(jì)數(shù)值C。將該range的所有索引所在的節(jié)點(diǎn)都進(jìn)行遍歷,按照上面規(guī)則得到各索引所在節(jié)點(diǎn)的計(jì)數(shù)C后,選擇其中一個(gè)計(jì)數(shù)C最小的節(jié)點(diǎn),作為該range的執(zhí)行節(jié)點(diǎn),然后更新該節(jié)點(diǎn)的當(dāng)前計(jì)數(shù)B為對(duì)應(yīng)的計(jì)數(shù)值C,標(biāo)記該range會(huì)最終在這個(gè)節(jié)點(diǎn)上執(zhí)行。每一個(gè)節(jié)點(diǎn)的計(jì)數(shù)值初始均設(shè)為0。對(duì)所有的range都進(jìn)行上面過程,使得協(xié)調(diào)器根據(jù)range中的計(jì)數(shù)采用最小先執(zhí)行的原則,進(jìn)行文件檢索,最終可以保證每個(gè)節(jié)點(diǎn)的數(shù)據(jù)的均衡且保障效率。本發(fā)明的協(xié)調(diào)器還采用最小先執(zhí)行、單點(diǎn)多并發(fā)順序控制的原則,進(jìn)行實(shí)際文件查詢的調(diào)度。最小先執(zhí)行是指本次待查詢的文件數(shù)最小的節(jié)點(diǎn),優(yōu)先執(zhí)行。單點(diǎn)多并發(fā)順序控制是指當(dāng)一個(gè)節(jié)點(diǎn)內(nèi)出現(xiàn)多個(gè)需要并發(fā)查詢的文件時(shí),將同一塊磁盤上的文件由并發(fā)訪問變成順序訪問。需要說明的是,此處的順序訪問也可以是并發(fā)的順序訪問,即一次并發(fā)訪問2個(gè)或多個(gè)文件,該處并發(fā)訪問的文件數(shù)受配置文件控制。本發(fā)明的第二方面,是優(yōu)化全文讀取引擎機(jī)制。Lucene本身就是一套用于全文檢索和搜尋的開源程式庫,由Apache軟件基金會(huì)支持和提供,并且提供了一個(gè)簡(jiǎn)單卻強(qiáng)大的應(yīng)用程式接口,能夠做全文索引和搜尋。同時(shí)Lucene也是當(dāng)前以及最近幾年最受歡迎的免費(fèi)Java信息檢索程序庫。同時(shí)為了保障兼容性,檢索也可以自由切換讀取原始的RCFile文件數(shù)據(jù)。因?yàn)長(zhǎng)ucene文件無復(fù)本機(jī)制,所以節(jié)點(diǎn)文件很可能會(huì)出現(xiàn)問題,所以當(dāng)讀取Lucene節(jié)點(diǎn)有故障時(shí),會(huì)選擇讀取該Lucene文件對(duì)應(yīng)的RCFile文件,以保障檢索流程的正確性及可用性。同時(shí),該讀取引擎混合了Lucene讀取(本地及遠(yuǎn)程)、RCFile讀取,使該引擎有了一定的容錯(cuò)能力。本地節(jié)點(diǎn)在執(zhí)行一個(gè)fragment時(shí),使用兩種方式調(diào)用Lucene實(shí)現(xiàn)檢索:1.若對(duì)應(yīng)的Lucene索引文件在本地節(jié)點(diǎn)時(shí),直接通過JNI(Java本地接口)調(diào)用Lucene的接口進(jìn)行檢索,直接訪問對(duì)應(yīng)的數(shù)據(jù)文件,獲取對(duì)應(yīng)的結(jié)果集;2.若對(duì)應(yīng)的Lucene文件在遠(yuǎn)程節(jié)點(diǎn)時(shí),此時(shí)每個(gè)節(jié)點(diǎn)有一個(gè)Lucene的socket接口,通過訪問該socket接口,進(jìn)行tcp遠(yuǎn)程訪問Lucene進(jìn)行檢索,獲取數(shù)據(jù)結(jié)果集。同時(shí)socke接口還實(shí)現(xiàn)RCFile與Lucene的元數(shù)據(jù)變化時(shí)的更新。調(diào)用Lucene的接口就是指訪問對(duì)應(yīng)節(jié)點(diǎn)上Lucene的守護(hù)進(jìn)程。執(zhí)行節(jié)點(diǎn)調(diào)用訪問Lucene接口時(shí),出現(xiàn)錯(cuò)誤:1.若是對(duì)應(yīng)節(jié)點(diǎn)上維護(hù)Lucene索引的守護(hù)進(jìn)程已經(jīng)掛掉,或遠(yuǎn)程tcp連接無法建立時(shí),則執(zhí)行節(jié)點(diǎn)直接選擇讀取RCFile文件;2.若讀取具體Lucene文件出錯(cuò)時(shí),此時(shí),執(zhí)行節(jié)點(diǎn)重新調(diào)用該Lucene文件對(duì)應(yīng)的RCFile文件,重新進(jìn)行檢索。本發(fā)明的全文讀取引擎機(jī)制如圖3所示。每個(gè)range在執(zhí)行時(shí),讀取的數(shù)據(jù)可能在本地或者遠(yuǎn)程的Lucene文件或RCFile文件中,在讀取的時(shí)候,若是有Lucene文件,則先讀取Lucene文件,否則讀取RCFile文件,這樣可以保證檢索時(shí),數(shù)據(jù)結(jié)果總能正確給出。該機(jī)制也可以手動(dòng)聲明只讀取Lucene或只讀取RCFile文件。每個(gè)存儲(chǔ)Lucene文件的節(jié)點(diǎn),都會(huì)有一個(gè)守護(hù)進(jìn)程對(duì)該節(jié)點(diǎn)的Lucene文件進(jìn)行相應(yīng)的維護(hù),主要是維護(hù)Lucene文件與RCFile文件中所管理的數(shù)據(jù)文件的一致性。如圖3所示,執(zhí)行節(jié)點(diǎn)首先會(huì)取一個(gè)range,該range包含RCFile文件信息及對(duì)應(yīng)的Lucene文件信息。首先判斷該range是否要走Lucene流程,若是則根據(jù)Lucene文件的相關(guān)信息,確定要訪問的Lucene文件是在本地還是遠(yuǎn)程,若是在本地,則初始化JNI接口并通過JNI接口直接訪問對(duì)應(yīng)的Lucene文件。若是遠(yuǎn)程,則初始化http接口,通過tcp訪問遠(yuǎn)程節(jié)點(diǎn)的Lucene守護(hù)進(jìn)程,通過該守護(hù)進(jìn)程訪問對(duì)應(yīng)的Lucene文件,然后通過socket接口返回?cái)?shù)據(jù)。若不走Lucene文件的訪問流程時(shí),則會(huì)直接通過對(duì)應(yīng)的集群文件系統(tǒng),直接訪問對(duì)應(yīng)的RCFile文件。因?yàn)長(zhǎng)ucene是無復(fù)本機(jī)制的,所以一個(gè)Lucene的單點(diǎn)故障會(huì)相對(duì)比較高,所以,當(dāng)訪問一個(gè)Lucene文件出錯(cuò)時(shí),會(huì)再次查找Lucene文件對(duì)應(yīng)的RCFile文件,重新獲取對(duì)應(yīng)的數(shù)據(jù),保證檢索的持續(xù)性。同時(shí),為了保障檢索過程的正確性,若某一個(gè)節(jié)點(diǎn)在出錯(cuò)時(shí),該節(jié)點(diǎn)的數(shù)據(jù)會(huì)丟棄,重新分配檢索節(jié)點(diǎn)重新執(zhí)行檢索。本發(fā)明的第三方面,是全文檢索的排序及分組。當(dāng)使用全文檢索時(shí),可以對(duì)檢索字段的相關(guān)度進(jìn)行排序,或者按相關(guān)度分組后排序。相關(guān)度的排序是通過權(quán)重實(shí)現(xiàn)。在檢索語句中,可以對(duì)檢索字段賦于權(quán)重,然后,當(dāng)查詢下發(fā)到Lucene時(shí),Lucene會(huì)根據(jù)權(quán)重計(jì)算得分,根據(jù)得分返回初次排序的結(jié)果。每個(gè)節(jié)點(diǎn)獲取到的值是已經(jīng)排序完成的結(jié)果集,當(dāng)每個(gè)節(jié)點(diǎn)的結(jié)果匯集到協(xié)調(diào)器時(shí),會(huì)再次根據(jù)相關(guān)度進(jìn)行排序,最后返回用戶的就是全局對(duì)相關(guān)度的排序結(jié)果?;镜恼Z法如下:selectexpression1[,expression2...]FROMtable_reference[others][fulltext(expression1^weight[,expression2^weight…])]其中,expression1、expression2表示待檢檢字段,table_reference表示待檢索文件,weight表示權(quán)重,fulltext表示全文檢索。在生成執(zhí)行計(jì)劃樹時(shí),會(huì)多使用一個(gè)字段以保存每一條檢索結(jié)果的權(quán)重計(jì)算值,此時(shí),該節(jié)點(diǎn)返回的數(shù)據(jù)已經(jīng)是排序完成的數(shù)據(jù),而當(dāng)這些數(shù)據(jù)再次匯總到上一層節(jié)點(diǎn)時(shí),會(huì)根據(jù)這些權(quán)重值對(duì)所有匯總數(shù)據(jù)再進(jìn)行一次排序。然后,返回給用戶的就是所有符合以相關(guān)度排序的數(shù)據(jù)結(jié)果集。在檢索時(shí),若是分組數(shù)據(jù),首先在各個(gè)執(zhí)行引擎內(nèi)部,將數(shù)據(jù)進(jìn)行分組并打分,按照相關(guān)度排序;然后再在多個(gè)執(zhí)行引擎之間,將分組數(shù)據(jù)兩兩合并,即進(jìn)行融和操作,并按照融合后的權(quán)重值進(jìn)行相關(guān)度排序;合并操作是遞歸的進(jìn)行,直至完成最上層的合并,最終輸出給用戶。本發(fā)明對(duì)全文檢索的結(jié)果數(shù)據(jù)根據(jù)相關(guān)度進(jìn)行排序,整體流程如圖4所示。在檢索某個(gè)字段時(shí),可以給該字段設(shè)置權(quán)值,當(dāng)該權(quán)值設(shè)置成功后,在下層的讀取引擎會(huì)把該權(quán)重加入字段中,進(jìn)而結(jié)果按權(quán)值進(jìn)行排序,同時(shí)可以使用orderby對(duì)排序的順序進(jìn)行指定,默認(rèn)是升序,相關(guān)度高的會(huì)排序在前,若是desc則相反。Lucene語法已經(jīng)實(shí)現(xiàn)了該功能,但是在集群環(huán)境中,還要對(duì)每一個(gè)節(jié)點(diǎn)返回的數(shù)據(jù)再進(jìn)行一次排序。通過在檢索時(shí),每個(gè)節(jié)點(diǎn)在返回每一行檢索結(jié)果時(shí),會(huì)新增加一個(gè)字段存儲(chǔ)該行的打分結(jié)果,該結(jié)果匯總到協(xié)調(diào)節(jié)點(diǎn)時(shí),會(huì)根據(jù)該值,再進(jìn)行一次排序,最終得到已經(jīng)排序完成的檢索結(jié)果。因?yàn)樵摯蚍值乃惴?,在每個(gè)節(jié)點(diǎn)一樣的,這樣每一個(gè)節(jié)點(diǎn)在處理完成后的匯總結(jié)果也能直接使用該計(jì)算結(jié)果進(jìn)行相應(yīng)的排序。同時(shí)也可以實(shí)現(xiàn)對(duì)于檢索字段的排序,該功能通過使用groupby方式,對(duì)檢索的字段進(jìn)行排序??梢越Y(jié)合相關(guān)度的排序算法,實(shí)現(xiàn)對(duì)分組數(shù)據(jù)根據(jù)相關(guān)度進(jìn)行排序。分組時(shí),會(huì)根據(jù)相關(guān)度排序算法,把符合分組的數(shù)據(jù)的打分值按照一定的算法,進(jìn)行融合計(jì)算,再按照融合后的值,對(duì)分組數(shù)據(jù)進(jìn)行相關(guān)度的排序。本發(fā)明的幾乎沒有損失檢索系統(tǒng)原本應(yīng)該的性能,對(duì)于性能有一定程度的提升。首先,當(dāng)全文檢索或條件字段檢索時(shí),才會(huì)使用Lucene文件進(jìn)行數(shù)據(jù)讀取,其余流程不變;其次,當(dāng)使用Lucene文件進(jìn)行數(shù)據(jù)讀取時(shí),若是網(wǎng)絡(luò)原因則會(huì)直接選擇原始流程,若對(duì)應(yīng)的Lucene文件損壞時(shí),也會(huì)使用原始的流程繼續(xù)讀取對(duì)應(yīng)的RCFile,而該過程產(chǎn)生的性能損失很小。原本流程中,使用的是RCFile文件格式,該文件格式在查詢隨機(jī)數(shù)據(jù)時(shí),性能比較低下,因?yàn)槊看味家闅v整個(gè)文件,才能找到符合要求的數(shù)據(jù),雖然在集群的環(huán)境下,每個(gè)節(jié)點(diǎn)的數(shù)據(jù)量相對(duì)較少,但是正因?yàn)槿绱?,每一個(gè)節(jié)點(diǎn)的性能提升,對(duì)于整體集群環(huán)境的性能的提升就會(huì)產(chǎn)生巨大的影響。而當(dāng)使用Lucene文件進(jìn)行檢索時(shí),首先會(huì)對(duì)已經(jīng)存在的文件建立索引,把原本的一整塊數(shù)據(jù)再次切割成有意義的碎片。而當(dāng)再次檢索時(shí),則可以直接定位到需要的塊,而不用遍歷整個(gè)文件一次,所以可以極大地提升性能。應(yīng)該注意到并理解,在不脫離后附的權(quán)利要求所要求的本發(fā)明的精神和范圍的情況下,能夠?qū)ι鲜鲈敿?xì)描述的本發(fā)明做出各種修改和改進(jìn)。因此,要求保護(hù)的技術(shù)方案的范圍不受所給出的任何特定示范教導(dǎo)的限制。當(dāng)前第1頁1 2 3 當(dāng)前第1頁1 2 3 
      當(dāng)前第1頁1 2 3 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1