本發(fā)明屬于信息技術(shù)領(lǐng)域,具體涉及一種提速的基于IPC編碼的查詢處理方法。
背景技術(shù):
目前的檢索系統(tǒng)里大多采用倒排索引作為處理用戶查詢的數(shù)據(jù)結(jié)構(gòu)。倒排索引文件(IF)通常比較大,一般不能完整地放入內(nèi)存,因此實(shí)際在應(yīng)用時(shí)對(duì)索引文件都要進(jìn)行按照某種編碼進(jìn)行壓縮。一般來(lái)說(shuō),壓縮率越高的編碼在線上進(jìn)行查詢處理時(shí)會(huì)更加慢一些,因此所有的編碼都是在空間跟處理時(shí)間上找平衡點(diǎn)。
在編碼ID的索引文件時(shí)有兩種基本的策略,一種是編碼原始的遞增的值,另一種是編碼連續(xù)兩個(gè)遞增的值之間的差值(delta編碼)。一般來(lái)說(shuō)差值遠(yuǎn)遠(yuǎn)小于原值,因此編碼差值可能會(huì)帶來(lái)一些壓縮率的提高。但某些原值編碼中也有非常高效的編碼。
當(dāng)前在產(chǎn)業(yè)界用的比較多的是PFD編碼(Marcin Zukowski,Sandor Heman,Niels Nes and Peter Boncz.Superscalar RAM-CPU cache compression.In Proceedings of the 22nd International Conference on Data Engineering(ICDE),no.59,pages 1-12.IEEE,2006.),PFD編碼屬于delta編碼,它利用了ID的差值的分布特征,將90%較小的delta值根據(jù)最大字長(zhǎng)位對(duì)齊順序地存儲(chǔ),而把10%的較大值作為特例單獨(dú)用變長(zhǎng)編碼存儲(chǔ)。PFD編碼的壓縮率跟解壓速度都可以讓人接受,實(shí)現(xiàn)簡(jiǎn)單,因此在工業(yè)上得到廣泛應(yīng)用。它的缺點(diǎn)是它建立在差值的分布特性的假設(shè)的前提下,在不滿足這個(gè)假設(shè)的時(shí)候它的壓縮率不算太高。
IPC編碼是一種在原值上的編碼(Alistair Moat and Lang Stuiver.Binary interpolative coding for effective index compression.Information Retrieval,vol.3,no.1,pages 25-47,2000.),它需要編碼在遞增的原值上。具體做法是對(duì)某個(gè)列表或者子列表先編碼其中值,并根據(jù)最大與最小乃至區(qū)間長(zhǎng)度來(lái)判斷中值的取值區(qū)間,根據(jù)此區(qū)間來(lái)決定編碼該值占幾個(gè)存儲(chǔ)字長(zhǎng)。在確定了中值后,原區(qū)間被平分為兩個(gè)子區(qū)間,在子區(qū)間上的遞歸地進(jìn)行這樣編碼中值的操作,直至子區(qū)間的長(zhǎng)度為0。
IPC的編碼是一個(gè)樹(shù)形結(jié)構(gòu),通過(guò)這種遞歸地減小區(qū)間的方法,最后能以很小的長(zhǎng)度編碼各值,這也是它壓縮率非常高的原因。但是同樣可以看到在編碼時(shí)它需要更多的計(jì)算,例如計(jì)算上下限等等,而它的解碼需要復(fù)原這個(gè)過(guò)程,因此速度是比較慢的,在布爾與排序查詢中IPC編碼的速度大約是PFD編碼速度的1/4與1/3。
此外還存在其他的編碼,但在所有的主流編碼中,IPC編碼的壓縮率是最高的,也是線上處理速度偏慢的一種。
IPC編碼因?yàn)槠涓邏嚎s率會(huì)被用在某些有著嚴(yán)格存儲(chǔ)空間限制的應(yīng)用場(chǎng)景內(nèi),例如超大規(guī)模數(shù)據(jù)量的檢索系統(tǒng)或者嵌入式系統(tǒng)等等。但I(xiàn)PC編碼最大的缺點(diǎn)在于解壓速度較慢,由此導(dǎo)致在線上處理的速度也偏慢。例如常見(jiàn)的OPTPFD編碼的一個(gè)rank查詢的處理時(shí)間大約為IPC編碼的1/3。雖然IPC編碼擁有不錯(cuò)的壓縮率,但是線上的查詢處理時(shí)間會(huì)增大使用用戶的等待時(shí)間,因此限制了它的進(jìn)一步應(yīng)用。
技術(shù)實(shí)現(xiàn)要素:
因?yàn)榛贗PC編碼的倒排索引在線上處理的速度都相對(duì)較慢,本發(fā)明的目的就在于根據(jù)IPC編碼的特點(diǎn)優(yōu)化查詢速度(其中的查詢包括在圖書(shū)館系統(tǒng)中常用的精確的布爾查詢與目前搜索引擎中常用的排序查詢),進(jìn)而達(dá)到提高檢索系統(tǒng)的用戶體驗(yàn)的目的。
本發(fā)明采用的技術(shù)方案如下:
一種提速的基于IPC編碼的查詢處理方法,其步驟包括:
1)把IPC編碼下的索引文件視為樹(shù)形的跳表文件,實(shí)現(xiàn)快讀略過(guò)子樹(shù)的算法;
2)在處理布爾的求交查詢時(shí),根據(jù)鏈表的單調(diào)性判斷是否略過(guò)(skip)某些子樹(shù),略過(guò)(skip)操作可節(jié)省大量時(shí)間從而提高線上布爾查詢處理速度。
3)處理排序查詢時(shí),根據(jù)文檔ID列表的求交結(jié)果的位置可以快速取出對(duì)應(yīng)的頻率的索引文件的對(duì)應(yīng)的值,通過(guò)略過(guò)所有不必要訪問(wèn)的子樹(shù)的手段可以提高線上排序查詢的處理速度。
進(jìn)一步地,略過(guò)子樹(shù)的操作通過(guò)一個(gè)存儲(chǔ)節(jié)點(diǎn)信息結(jié)構(gòu)體的棧來(lái)加速實(shí)現(xiàn)。
進(jìn)一步地,在處理布爾求交查詢時(shí),對(duì)一個(gè)已經(jīng)解壓的順序列表與一個(gè)IPC編碼壓縮的索引列表執(zhí)行快速求交算法。
進(jìn)一步地,在處理排序查詢時(shí)使用TAAT處理方式,在達(dá)到累加器的上限之前,對(duì)查詢?cè)~的處理采用union策略,在達(dá)到上限后,采用繼續(xù)更新累加器的continue策略。
本發(fā)明的有益效果如下:
1)在不增加存儲(chǔ)空間的前提下,加快基于IPC編碼的布爾求交查詢的處理速度約50%。
2)在不增加存儲(chǔ)空間的前提下,加快基于IPC編碼的排序查詢的處理速度約10%。
附圖說(shuō)明
圖1.布爾AND查詢處理流程圖。
圖2.排序查詢處理流程圖。
圖3.union策略處理流程。
圖4.Continue策略處理流程圖。
圖5.7個(gè)節(jié)點(diǎn)的二叉樹(shù)的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面通過(guò)具體實(shí)施例和附圖,對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
本發(fā)明提供的提速算法,主要包括三個(gè)部分。一部分是在解壓縮IPC編碼的索引文件時(shí)的恢復(fù)與略過(guò)算法,第二部分是在處理布爾求交類型查詢時(shí),對(duì)一個(gè)已經(jīng)解壓的順序列表與一個(gè)IPC編碼壓縮的索引列表的快速求交算法。第三部分是在處理排序類型查詢時(shí),根據(jù)需要解壓的特定的值的位置列表(COlist)來(lái)快速獲取對(duì)應(yīng)的頻率值的算法。
1.恢復(fù)(restore)與略過(guò)(skip)
IPC編碼在編碼時(shí)展開(kāi)為一個(gè)二叉排序樹(shù),而在存儲(chǔ)時(shí)按照先序的方式密集存儲(chǔ)。在復(fù)原時(shí)也必須按照二叉排序樹(shù)的結(jié)構(gòu)恢復(fù)所有值,考慮到IPC編碼的有序性,可以將編碼視為一個(gè)壓縮的特殊結(jié)構(gòu)的跳表。
跟跳表不同的是,跳表里所有待跳節(jié)點(diǎn)都有兩個(gè)指針,分別指向下一個(gè)節(jié)點(diǎn)跟skip后的下一個(gè)節(jié)點(diǎn)。在IPC編碼里,跳向skip后的下一個(gè)節(jié)點(diǎn)是困難的,因?yàn)樾枰老乱粋€(gè)skip后的下一個(gè)節(jié)點(diǎn)相對(duì)本節(jié)點(diǎn)在索引文件上的偏移量。而為了獲得偏移量,需要計(jì)算待skip的子樹(shù)在編碼中的長(zhǎng)度。這個(gè)過(guò)程也是一個(gè)遞歸的過(guò)程。我們發(fā)現(xiàn)計(jì)算一個(gè)子樹(shù)在IPC編碼中編碼長(zhǎng)度的操作,跟恢復(fù)這個(gè)子樹(shù)中所有值的操作比起來(lái),計(jì)算長(zhǎng)度的耗時(shí)要穩(wěn)定地少大約25%。這也是本發(fā)明能提速的根本原因。
計(jì)算一個(gè)樹(shù)的長(zhǎng)度操作(skip)跟恢復(fù)一棵樹(shù)的所有值(restore)都是一個(gè)遞歸的過(guò)程,我們一般用一個(gè)存儲(chǔ)節(jié)點(diǎn)信息的結(jié)構(gòu)體的棧來(lái)加速實(shí)現(xiàn)。
在restore函數(shù)里,一個(gè)節(jié)點(diǎn)信息結(jié)構(gòu)體需要保存的項(xiàng)為:1)left(該節(jié)點(diǎn)在當(dāng)前區(qū)間左邊的元素個(gè)數(shù)),2)right(該節(jié)點(diǎn)在當(dāng)前區(qū)間右邊的元素個(gè)數(shù)),3)max(當(dāng)前區(qū)間的最大值),4)min(當(dāng)前區(qū)間的最小值),5)orgvalue(該節(jié)點(diǎn)的原值),6)pos(當(dāng)前節(jié)點(diǎn)的位置)。
相較之下,在skip函數(shù)里,一個(gè)節(jié)點(diǎn)信息結(jié)構(gòu)體需要保存的項(xiàng)為:1)left(該節(jié)點(diǎn)在當(dāng)前區(qū)間左邊的元素個(gè)數(shù)),2)right(該節(jié)點(diǎn)在當(dāng)前區(qū)間右邊的元素個(gè)數(shù)),3)len(當(dāng)前區(qū)間的長(zhǎng)度),4)tmpvalue(該節(jié)點(diǎn)在IPC索引文件中記錄的值)。尤其在葉子節(jié)點(diǎn)下,tmpvalue也是不需要恢復(fù)的。
下表列出了根據(jù)父節(jié)點(diǎn)計(jì)算子節(jié)點(diǎn)的信息結(jié)構(gòu)體中各項(xiàng)的公式。其中下標(biāo)的ove代表全局,par代表父節(jié)點(diǎn)。標(biāo)*的公式用于排序查詢。
表1 IPC編碼信息結(jié)構(gòu)體各項(xiàng)計(jì)算公式
2.布爾求交查詢時(shí)的快速求交算法(IntersectWithSkip)
圖1為本發(fā)明的布爾AND查詢處理流程圖。從圖上可以看出,本發(fā)明所提出的方法跟標(biāo)準(zhǔn)的方法相比主要區(qū)別在于求交操作上。標(biāo)準(zhǔn)的方法是先恢復(fù)待求交的壓縮列表中的所有值,然后進(jìn)行標(biāo)準(zhǔn)的兩個(gè)有序數(shù)列求交操作。在本發(fā)明里通過(guò)如下算法將求交操作跟恢復(fù)過(guò)程合并了,這樣就能減少一些不必要的操作,只恢復(fù)必要的值,略過(guò)其他值。
我們定義恢復(fù)后的數(shù)值列表保存在數(shù)列Rlr中,我們待恢復(fù)的列表是ls,已恢復(fù)列表是Rlr1,節(jié)點(diǎn)信息結(jié)構(gòu)體的棧是S。定義Rlrcur、Rlr1cur為Rlr與Rlr1上的當(dāng)前指針。對(duì)于一個(gè)根為root的樹(shù),我們定義leftlist是root到其最左葉子節(jié)點(diǎn)的路徑的逆路徑。
快速求交算法的主要步驟如下:
1.恢復(fù)根節(jié)點(diǎn)并壓入棧。
2.當(dāng)棧不為空時(shí),我們?nèi)oot為棧首元素并執(zhí)行如下循環(huán)。
3.如果root的原值小于Rlr1cur所指的值,我們可以略過(guò)root的整個(gè)左子樹(shù)。我們對(duì)root的左子樹(shù)的根節(jié)點(diǎn)調(diào)用skip函數(shù)。
4.如果root的原值不小于Rlr1cur所指的值,恢復(fù)root的子樹(shù)下所有最左邊的節(jié)點(diǎn)。
5.執(zhí)行如下循環(huán)。
6.如果Rlr1cur所指的值小于或等于root的原值,那么執(zhí)行第7步。否則執(zhí)行第10步。
7.如果Rlr1cur所指的值等于root的原值。那么把root的原值壓入結(jié)果列表Rlr。Rlr上指針Rlrcur后移。無(wú)論條件是否滿足,執(zhí)行第8步。
8.如果Rlr1列表到了其邊界,那么跳出函數(shù)。(結(jié)果列表已經(jīng)到了其末端,可以忽略掉IF結(jié)構(gòu)中余下的節(jié)點(diǎn)。)否則執(zhí)行第9步。
9.Rlr1列表上指針Rlr1cur后移。返回第5步。
10.定義tmp是棧S的top節(jié)點(diǎn)的指針,并彈出棧。
11.如果Rlr1cur所指的值小于tmp節(jié)點(diǎn)的leftlist下下一個(gè)節(jié)點(diǎn)(或者全局最大值)的原值,并且tmp節(jié)點(diǎn)存在右孩子,那么執(zhí)行第12步,否則執(zhí)行第13步。
12.恢復(fù)他的右孩子節(jié)點(diǎn)并壓入棧S?;氐降?步。
13.調(diào)用skip函數(shù)跳過(guò)其所有右子樹(shù)節(jié)點(diǎn),并回到第5步。
最后在列表Rlr中保存的值就是布爾與查詢中求交的結(jié)果。該算法中實(shí)現(xiàn)了skip的操作。
3.排序查詢時(shí)的帶skip的頻率獲取算法
排序查詢更接近于求并操作而不是求交操作,因此,理論上對(duì)排序查詢而言skip是不能實(shí)現(xiàn)的。但是在實(shí)際上的TAAT(Anh,V.N.,Moffat,A.:Pruned query evaluation using pre-computed impacts.In:SIGIR,pp.pages 372–379.ACM,New York,2006)查詢處理方式下,一般為了限制無(wú)限增長(zhǎng)的累加器規(guī)模,會(huì)設(shè)置一個(gè)累加器的上限。在達(dá)到這個(gè)上限之前,對(duì)查詢?cè)~的處理采用union策略,一旦達(dá)到這個(gè)上限,當(dāng)前有兩種處理策略。第一種是立即停止累加器更新并直接計(jì)算文檔得分的quit策略;第二種是停止增加累加器,但繼續(xù)更新累加器的continue策略。實(shí)踐證明continue策略下的查詢效果接近無(wú)上限增加累加器的方法,但速度上要快2-5倍。因此,在實(shí)際的排序查詢處理中continue策略是經(jīng)常被用到的。
圖2是排序查詢處理流程圖,其中包括了在累加器數(shù)目達(dá)到上限之前采用的union策略(不包含skip技術(shù))以及達(dá)到上限之后采用的continue策略。圖3是union策略的處理流程圖。而圖4為continue策略的處理流程圖。在continue策略里,一旦累加器達(dá)到上限,對(duì)接下來(lái)的詞項(xiàng)的處理就是一個(gè)求交的操作。
在排序查詢里面的用于獲得文件ID的快速求交算法跟布爾求交查詢的快速求交算法基本一樣,區(qū)別在于在排序查詢里應(yīng)該另外計(jì)算每個(gè)結(jié)果的(位置信息)作為定位頻率列表里的對(duì)應(yīng)元素的索引。因此,我們介紹的重心在于對(duì)頻率列表的快速處理。
由于頻率列表實(shí)際上并非遞增列表,如果頻率列表要使用IPC編碼存儲(chǔ),那么我們只能存儲(chǔ)其累加形式。例如對(duì)于{1,1,3,1,5,1,1}的列表我們要先累加為{1,2,5,6,11,12,13},之后再使用IPC編碼進(jìn)行存儲(chǔ)。這樣在解壓的時(shí)候,如果我們需要獲得第4個(gè)位置的頻率值,我們需要得到第4與第3兩個(gè)位置的頻率值,他們分別是6與5。
因此,按照大小排序時(shí),在當(dāng)前結(jié)果元素之前的元素的pos信息也應(yīng)該記錄下來(lái),所有的這些元素按照壓縮順序存入COlist(位置列表)中。最后,在排序查詢里的求交操作每次不修改原解壓表Rlr,之后通過(guò)生成的COlist算法在頻率的壓縮列表里快速找到對(duì)應(yīng)的頻率值。具體實(shí)現(xiàn)細(xì)節(jié)如下:
首先在COlist里面,把位置連續(xù)的兩個(gè)節(jié)點(diǎn)定義為CON node,否則為INCON node。圖5為說(shuō)明COlist的附圖。
圖5是一個(gè)有七個(gè)節(jié)點(diǎn)的IPC編碼的二叉樹(shù)型結(jié)構(gòu)。其中每個(gè)元素代表該節(jié)點(diǎn)在編碼中的存儲(chǔ)位置。如果通過(guò)求交操作我們發(fā)現(xiàn)位置為3,1,6的節(jié)點(diǎn)是結(jié)果節(jié)點(diǎn),那么他們的前一個(gè)節(jié)點(diǎn),分別是0(第0個(gè)節(jié)點(diǎn)代表0),4,5。因此,COlist將會(huì)是{0,3,4,1,5,6}。其中{0,3},{4,1},{5,6}分別是同一節(jié)點(diǎn)的當(dāng)前值與上一個(gè)值,因此屬于CON node,而{3,4},{1,5}則屬于INCON node。他們?cè)谒惴ㄌ幚砹鞒躺蠈?huì)有一定區(qū)別。
排序查詢的詳細(xì)流程見(jiàn)圖2。我們只介紹入口的SkipFrequence算法。
SkipFrequence根據(jù)COlist的順序依次獲得相應(yīng)的節(jié)點(diǎn)對(duì)應(yīng)的值。我們需要兩個(gè)算法,當(dāng)下一個(gè)節(jié)點(diǎn)跟當(dāng)前節(jié)點(diǎn)屬于CON Node時(shí)我們調(diào)用SkipToCONNode算法來(lái)獲取這個(gè)CON Node的值;當(dāng)下一個(gè)節(jié)點(diǎn)跟當(dāng)前節(jié)點(diǎn)屬于INCON Node的時(shí)候我們調(diào)用SkipToINCONNode算法來(lái)獲取這個(gè)INCON Node的值。此外,我們還需要一個(gè)SkipToChild算法與一個(gè)SkipToAncestor算法來(lái)分別將停留在IF文件上,指向當(dāng)前節(jié)點(diǎn)的指針移到指定的下一個(gè)孩子節(jié)點(diǎn)或者指定的下一個(gè)祖先節(jié)點(diǎn)的位置并返回其orgvalue。
SkipToCONNode算法實(shí)現(xiàn)比較簡(jiǎn)單,我們需要一個(gè)棧S,一個(gè)nextpos值代表下一個(gè)孩子節(jié)點(diǎn)的位置。步驟如下:
1.棧S的top節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn)賦給cur。
2.如果cur的pos小于nextpos,執(zhí)行語(yǔ)句3,否則執(zhí)行語(yǔ)句7。
3.恢復(fù)cur節(jié)點(diǎn)的右孩子,并壓入棧S。
4.cur賦予棧S的top節(jié)點(diǎn),當(dāng)cur的left大于0時(shí)執(zhí)行如下5的語(yǔ)句的循環(huán)。
5.恢復(fù)cur的左孩子節(jié)點(diǎn)并壓入棧。
6.返回S的top節(jié)點(diǎn)的orgvalue作為函數(shù)的返回值。
7.棧S的top節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn)賦給cur。當(dāng)cur不為空時(shí)執(zhí)行8的語(yǔ)句循環(huán)。
8.如果cur的indicator為1(右孩子已經(jīng)被訪問(wèn)),我們就退棧。
9.把cur的indicator設(shè)置為0并返回cur的orgvalue作為函數(shù)的返回值。
SkipToChild算法的實(shí)現(xiàn)如下,我們需要一個(gè)棧S,一個(gè)nextpos值代表下一個(gè)孩子節(jié)點(diǎn)的位置。步驟如下:
1.棧S的top節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn)賦給cur。而gap是nextpos跟cur的差值。
2.當(dāng)gap不為0時(shí)執(zhí)行如下3-6的循環(huán),如果循環(huán)條件不滿足,則執(zhí)行第7步。
3.將gap與當(dāng)前節(jié)點(diǎn)的left值的差值賦給tempgap。如果tempgap大于0,說(shuō)明該節(jié)點(diǎn)在其右子樹(shù)上,執(zhí)行第4步;否則則在其左子樹(shù)上,執(zhí)行第6步。
4.調(diào)用skip函數(shù)跳過(guò)該節(jié)點(diǎn)的左子樹(shù)。
5.將cur的indicator設(shè)置為1并恢復(fù)其右孩子,并壓入棧S。gap設(shè)置為tempgap減去1?;氐降?步。
6.恢復(fù)cur的左孩子,并壓入棧S。gap設(shè)置為gap減去1,回答第2步。
7.返回當(dāng)前top節(jié)點(diǎn)的orgvalue。(已經(jīng)找到了目標(biāo)節(jié)點(diǎn)的值)
SkipToAncestor算法的實(shí)現(xiàn)如下,我們需要一個(gè)棧S,一個(gè)nextpos值代表下一個(gè)父節(jié)點(diǎn)的位置。步驟如下:
1.棧S的top節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn)賦給cur。而gap是nextpos跟cur的pos的差值。
2.調(diào)用skip函數(shù)跳過(guò)該節(jié)點(diǎn)的右子樹(shù)。
3.設(shè)置cur是當(dāng)前棧S的top節(jié)點(diǎn),當(dāng)棧不為空是執(zhí)行如下循環(huán)。否則執(zhí)行第8步。
4.如果cur的indicator等于1,說(shuō)明他的右孩子已經(jīng)被訪問(wèn)過(guò)了,那么我們執(zhí)行第5步,否則執(zhí)行第6步。
5.首節(jié)點(diǎn)退棧,并回到第3步。
6.gap重置為gap與當(dāng)前節(jié)點(diǎn)的right的差值,如果gap大于0,則執(zhí)行第7步,否則執(zhí)行第8步。
7.跳過(guò)cur的右子樹(shù),首節(jié)點(diǎn)退棧,并回到第3步。
8.達(dá)到了這個(gè)條件說(shuō)明已經(jīng)跳到了對(duì)應(yīng)節(jié)點(diǎn)或者對(duì)應(yīng)節(jié)點(diǎn)不存在,我們可以結(jié)束該函數(shù)了。
然后有SkipToINCONNode的方法,實(shí)現(xiàn)如下,我們需要一個(gè)棧S,一個(gè)nextpos值代表下一個(gè)INCON節(jié)點(diǎn)的位置。步驟如下:
1.棧S的top節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn)賦給cur。
2.如果cur的pos信息大于nextpos,則執(zhí)行語(yǔ)句3,否則執(zhí)行語(yǔ)句8.
3.棧S的top節(jié)點(diǎn),也就是當(dāng)前節(jié)點(diǎn)的pos值賦給cur,當(dāng)cur不為空時(shí)執(zhí)行如下循環(huán)4-7。
4.如果cur的pos跟nextpos一樣,那么說(shuō)明我們找到了這個(gè)祖先,我們執(zhí)行第5步,否則執(zhí)行第6步。
5.我們把cur的indicator設(shè)置為0并返回cur的orgvalue值作為函數(shù)的返回值。
6.如果cur的indicator為0,這說(shuō)明他的右孩子還沒(méi)有被訪問(wèn),這時(shí)候我們執(zhí)行語(yǔ)句7,否則我們直接返回到語(yǔ)句3。
7.我們對(duì)cur的右孩子調(diào)用skip函數(shù),并讓S的棧首出棧并返回語(yǔ)句3.
8.如果cur的pos恰好等于nextpos,我們直接返回cur的orgvalue值作為函數(shù)的返回值,否則我們執(zhí)行語(yǔ)句9。
9.我們?cè)O(shè)置gap為nextpos與cur的pos,cur的left,cur的right之和的差值。如果gap大于0,說(shuō)明nextpos的節(jié)點(diǎn)是cur的祖先節(jié)點(diǎn),我們調(diào)用return SkipToAnestor(S,gap)方法來(lái)找到下一個(gè)節(jié)點(diǎn)。否則說(shuō)明nextpos是cur的孩子節(jié)點(diǎn),我們調(diào)用return SkipToChild(S,gap)方法來(lái)找到下一個(gè)節(jié)點(diǎn)。
我們用一組實(shí)驗(yàn)數(shù)據(jù)來(lái)說(shuō)明本發(fā)明的有效性。
我們的實(shí)驗(yàn)的硬件環(huán)境是i5-2400 CPU,2.99G內(nèi)存。實(shí)驗(yàn)中采用的數(shù)據(jù)是新華社93年到00年的所有短訊。其中包括3百萬(wàn)個(gè)文檔,分詞處理后共有20,000個(gè)詞項(xiàng)。查詢是從文中隨機(jī)抽取某個(gè)長(zhǎng)度的連續(xù)的詞產(chǎn)生的。我們分別實(shí)現(xiàn)了布爾的求交查詢里不用略過(guò)的優(yōu)化的查詢處理方法,帶略過(guò)的優(yōu)化的處理查詢處理方法與目前較流行的OPTPFD編碼的查詢處理方法。
下面的表2是完全恢復(fù)一個(gè)特定高度的樹(shù)跟略過(guò)一個(gè)特定高度的樹(shù)平均所需要花的時(shí)間比較。
表2恢復(fù)操作與略過(guò)操作的時(shí)間比較
我們可以看到skip操作能穩(wěn)定地提高20%左右的處理時(shí)間。
表3列出了布爾的求交查詢里分別用原始的IPC,經(jīng)過(guò)我們優(yōu)化后的IPC與被廣泛使用的OPTPFD這三種方法處理時(shí)需要的平均查詢時(shí)間。
表3布爾求交查詢的三種方法平均查詢時(shí)間比較
表4列出了continue策略的排序查詢里分別用原始的IPC,經(jīng)過(guò)我們優(yōu)化后的IPC與被廣泛使用的OptPFD三種方法處理時(shí)需要的平均查詢時(shí)間。
表4基于continue策略的排序查詢的三種方法平均查詢時(shí)間比較
從以上實(shí)驗(yàn)結(jié)果表中可以看出,我們的方法對(duì)布爾查詢與排序查詢的查詢處理時(shí)間的提升率分別為50%與10%。
以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書(shū)所述為準(zhǔn)。