石秋娥,周 喜,王 軼
1.中國科學院 新疆理化技術研究所,烏魯木齊 830011
2.中國科學院大學,北京 100049
3.中國科學院 新疆理化技術研究所 新疆民族語音語言信息處理實驗室,烏魯木齊 830011
隨著計算機技術的發(fā)展,數(shù)據(jù)的規(guī)模量級也不斷提高,去中心化數(shù)據(jù)存儲方式可以滿足大數(shù)據(jù)環(huán)境下的數(shù)據(jù)存儲需求。星際文件系統(tǒng)[1]創(chuàng)造了一個點對點(peerto-peer,P2P)的分布式文件系統(tǒng),升級了現(xiàn)有的網(wǎng)絡結構,實現(xiàn)了真正意義上的去中心化存儲。
每一個上傳到IPFS系統(tǒng)中存儲的文件,系統(tǒng)都會返回一個唯一的文件標識符CID,但是資源請求者只有準確提供CID才能下載IPFS中相應文件。IPFS僅支持基于CID的數(shù)據(jù)獲取方式,制約了它的應用。由于缺乏相應的搜索功能,資源請求者很難通過關鍵詞或者其他描述信息獲取相關數(shù)據(jù)。研究IPFS的數(shù)據(jù)獲取方法,可以幫助用戶根據(jù)自身需求搜索數(shù)據(jù),有利于IPFS數(shù)據(jù)的共享與發(fā)現(xiàn),使IPFS滿足更多的應用場景。此外,當文件標識符丟失或遺忘時,可以通過其他方式獲取原來的數(shù)據(jù),避免數(shù)據(jù)的“失聯(lián)”。
在IPFS之上建立數(shù)據(jù)檢索層可以解決數(shù)據(jù)獲取問題。傳統(tǒng)的集中式索引雖然容易實現(xiàn)、便于管理,但是削弱了IPFS的去中心化程度,并限制IPFS網(wǎng)絡的可伸縮性。在為IPFS建立去中心化索引方面,已有研究實現(xiàn)的都是基于關鍵詞的索引,沒有充分考慮長查詢和短查詢之間的區(qū)別,一般認為三個以上關鍵詞的查詢屬于長查詢[2],將長查詢分詞為多個關鍵詞進行搜索會對網(wǎng)絡造成更多的負擔。為使數(shù)據(jù)的獲取更加高效,引入了緩存機制,由發(fā)布搜索的節(jié)點緩存相關結果,卻忽視了搜索發(fā)布節(jié)點與相關結果存儲節(jié)點之間的距離,使網(wǎng)絡中存儲大量不必要的冗余數(shù)據(jù),未充分利用緩存空間。
基于此,本文針對緩存空間的浪費問題,改進了緩存存儲機制,降低其所占存儲空間。針對IPFS數(shù)據(jù)獲取問題,設計了一種去中心化混合索引,使得搜索在長短查詢上都能有較好的表現(xiàn),對長查詢語句,使用word2vec[3]建立句子索引,使語義內容相似的句子索引能夠相鄰存儲,以有效獲取IPFS系統(tǒng)數(shù)據(jù)。
目前,關于IPFS的數(shù)據(jù)獲取這一方面的研究比較少,還沒有成熟的解決方案。IPFS-search[4]是github上的一個開源項目,該項目嘗試在IPFS上建立一個基于Elasticsearch的集中式搜索引擎,能為用戶提供關鍵詞搜索功能。然而集中式索引的服務器面臨著更多的攻擊,對存儲能力的要求也更高。文獻[5]提出為IPFS建立一個去中心化的搜索引擎,建立關鍵詞和CID的倒排索引,并使用DHT存儲索引文件,通過緩存層和過濾器加快搜索過程,該方法在較短的平均查詢時間內取得了較好的緩存命中率,但是當查詢語句有多個關鍵詞,對每個關鍵詞分別進行搜索會增加網(wǎng)絡的通訊路由。Desema[6]是一個基于IPFS和區(qū)塊鏈的去中心化服務市場,使用IPFS存儲數(shù)據(jù),并通過區(qū)塊鏈共享IPFS數(shù)據(jù)。雖然解決了區(qū)塊鏈存儲限制,但區(qū)塊鏈上實現(xiàn)的仍然是基于CID的數(shù)據(jù)獲取方式。Zhu等人[7]以去中心化的B+樹和HashMap為IPFS等去中心化存儲數(shù)據(jù)建立索引,實現(xiàn)了關鍵字搜索功能。基于DHT的索引結構存在大量相關工作,文獻[8-9]結合向量空間模型(VSM)和潛在語義索引(LSI)將文檔表示為笛卡爾空間的向量,但是其計算過程中對文檔矩陣進行SVD分解的計算代價太大,時間復雜度是O(N2),空間復雜度O(N3)。Reynolds等人[10]提出使用布隆過濾器和緩存加快DHT網(wǎng)絡中關鍵詞搜索過程,然而緩存也增加了大量的冗余數(shù)據(jù)。Hassanzadeh等人[11]提出了LANS和GLARAS方法,分別為節(jié)點分配地址及放置副本,使系統(tǒng)中每對節(jié)點之間的延遲對應于其地址的公共前綴長度,該方法提高了地址的位置感知能力,降低了搜索的端到端延遲及平均訪問延遲。Joung等人[12]使用超立方體索引關鍵字,相似關鍵字集的對象很可能被映射到彼此接近的點,削弱了DHT的哈希映射方式對數(shù)據(jù)鄰近性存儲的破壞。Armada[13]和LIGHT[14]通過使用前綴哈希樹(PHT)分布其索引結構,在DHT上實現(xiàn)輕量級的范圍查詢。而Echo[15]則使用了一種新的分布式結構TRT來擴展前綴哈希樹(PHT),通過TRT提高范圍查詢的效率。Ngom等人[16]提出一種名為摘要前綴樹(SPT)的新結構來解決DHT上關鍵詞超集搜索問題。董祥千等人[17]使用局部敏感哈希(locality sensitive Hashing,LSH)建立基于DHT的域索引,但主要是針對結構化數(shù)據(jù)集的連接搜索問題,僅對結構化數(shù)據(jù)開展了實驗。雖然目前關于IPFS數(shù)據(jù)獲取的研究有了一定進展,但是對長查詢帶來的網(wǎng)絡負擔及搜索效率問題并沒有很好的解決方案。
因此本文為IPFS數(shù)據(jù)建立去中心化混合索引,并利用DHT網(wǎng)絡存儲索引文件,實現(xiàn)IPFS的數(shù)據(jù)獲取。主要工作如下:第一,將文件存儲在IPFS得到的CID值與文檔關鍵詞組合,構成關鍵詞索引發(fā)布到DHT網(wǎng)絡中存儲,然后計算文檔的句子索引并存儲在DHT網(wǎng)絡中;第二,節(jié)點對搜索結果緩存,加快后續(xù)相同查詢的搜索過程;第三,對長查詢進行句子搜索,可以在索引存儲節(jié)點的鄰近范圍搜索;對短查詢,提取關鍵詞后對每個關鍵字分別搜索。
IPFS系統(tǒng)并不是一個全新的技術,而是集成并充分利用了BitTorrent、Git、P2P和密碼學等已有的技術[1]。IPFS系統(tǒng)中,以256 KB為塊大小對文件進行分塊存儲,每個分塊會分散存儲在IPFS網(wǎng)絡中的節(jié)點上,如果文件小于256 KB則直接存儲。如圖1所示,IPFS對文件分塊后,會計算每一個塊的哈希值,然后將所有塊的哈希值拼湊起來,再做一次哈希運算,從而得到最終哈希值,即文件的唯一標識符稱為CID。資源請求者只需要使用CID就可以在IPFS網(wǎng)絡中下載相應文件[18]。
圖1 文件唯一標識符的生成過程Fig.1 Generation process of unique content identifier
DHT是一種用于在分布式系統(tǒng)中存儲大量數(shù)據(jù)的數(shù)據(jù)結構,目前已經(jīng)得到了廣泛的應用,P2P、IPFS、區(qū)塊鏈等系統(tǒng)使用DHT作為底層架構。在DHT網(wǎng)絡中節(jié)點是動態(tài)變化的,一個節(jié)點很難獲取并存儲全網(wǎng)節(jié)點的相關信息,因此采用每個節(jié)點僅負責維護部分路由信息的網(wǎng)絡拓撲結構。DHT網(wǎng)絡使用哈希算法為每個節(jié)點分配一個節(jié)點地址(nodeID),為資源計算一個唯一標識的鍵值,使節(jié)點nodeID和資源鍵值具有相同值域,將資源存儲在nodeID與資源鍵值相同或相近的節(jié)點。為了實現(xiàn)網(wǎng)絡中資源的快速查找和定位,需要借助能保證路由查詢收斂的路由算法。相關的實現(xiàn)算法有很多,例如CAN[19]、Chord[20]、Kademlia[21]。DHT網(wǎng)絡具有以下特性:
(1)魯棒性。DHT能夠支持節(jié)點頻繁地加入和退出網(wǎng)絡,DHT具有良好的可擴展性。
(2)負載均衡。DHT通過哈希運算向網(wǎng)絡分配資源,能一定程度上實現(xiàn)負載均衡[22]。
(3)可用性。同一資源在多個節(jié)點存儲,單點故障或節(jié)點退出網(wǎng)絡時保證資源的可用性。
(4)高效性。在具有N個節(jié)點的網(wǎng)絡中,DHT保證路由收斂,在有限跳數(shù)內可以查找到目標資源。
圖2為IPFS數(shù)據(jù)獲取方法IPFS-DDAM(IPFSdecentralized data acquisition method)的過程總覽圖。該方法主要包括:索引構建、索引存儲、搜索過程、結果緩存等幾個過程。如圖2所示,步驟1~4為索引構建和索引存儲過程,步驟a~e為搜索過程。
圖2中步驟1~4為索引構建及索引存儲過程。首先,文件擁有者將文件上傳到IPFS系統(tǒng)中存儲,IPFS會返回文件唯一標識CID;然后,需要對文件建立兩種索引,一種是關鍵詞索引,對文件進行關鍵詞提取,由這若干個關鍵詞與CID組合構成若干個關鍵詞索引,另一種是句子索引,對提取出來的關鍵詞或文檔的中心句使用機器學習的方法構建文檔的句子向量表示,由降維后的句子向量和CID構成句子索引;最后,將生成的句子索引及關鍵詞索引發(fā)布到DHT網(wǎng)絡中存儲。IPFS網(wǎng)絡和DHT網(wǎng)絡只是邏輯上的劃分,物理上同一節(jié)點可以同時屬于兩個網(wǎng)絡。
圖2 IPFS-DDAM過程總覽圖Fig.2 Overview of IPFS-DDAM
3.1.1 關鍵詞索引
本文為IPFS系統(tǒng)實現(xiàn)了基于關鍵詞的搜索功能,使用TF-IDF[23](term frequency-inverse document frequency)算法提取文檔的前n個或者權重大于閾值的關鍵詞(k1,k2,…,k n),每個關鍵詞經(jīng)過哈希運算得到的關鍵詞哈希與文檔CID組成鍵值對,即為關鍵詞索引。關鍵詞哈希與nodeID具有相同值域。每個索引存儲節(jié)點負責存儲與其nodeID相同或相近的關鍵詞索引。
3.1.2 句子索引
為了將句子索引存儲在DHT網(wǎng)絡中,句子索引一方面需要體現(xiàn)文檔的內容,另一方面需要與DHT網(wǎng)絡的節(jié)點地址具有可映射性。為了使句子索引反映文檔內容,本文提出了一種使用機器學習的方式計算句子索引——SICP(sentence index calculation process)。首先,提取文檔的中心語句,分詞后得到若干關鍵詞(k1,k2,…,k n),或者使用TF-IDF算法提取文檔的前n個或者權重大于閾值的關鍵詞;然后采用word2vec將關鍵詞轉為詞向量表示:
其中,dimt i(t=1,2,…,m)表示第i個詞向量的第t維,此時句子可表示為,將各個詞向量乘以其權重比后對應維度相加,得到句子的向量表示:
其中,wi(i=1,2,…,n)表示第i個關鍵詞的權重值。
此時,得到句子向量保留了文檔的內容信息,句子之間的向量夾角反映了內容的相似程度。然而句子向量是一個高維空間的向量表示,不能夠映射到DHT網(wǎng)絡的nodeID。為了滿足句子向量與nodeID之間的映射關系,本文使用minhash[24]對句子向量進行降維。首先,選取N個隨機的哈希函數(shù);然后,對句子向量中的每個元素進行哈希運算,取其中的最小值;最后,重復N次上一步驟,得到代表句子向量的N個數(shù)值,即將句子向量降至N維。minhash是局部敏感哈希函數(shù)的一種,降維的同時可以保留高維度向量之間的相似性。使用minhash進行降維的合理性,是基于對兩個集合隨機求最小哈希值相等的概率等于兩個集合的Jaccard系數(shù),公式表示如下:
其中,Jac(A,B)是集合A、B之間的Jaccard系數(shù),采用公式(4)計算:
將降維后的向量各維度拼接后得到160 bit的值與文檔CID組成鍵值對,即為句子索引。句子索引的鍵值與nodeID具有相同值域。此外,句子索引保留了原內容的相似性,則相似內容的句子索引會相鄰存儲。用戶對同一對象的描述既具有差異性也具有相似性,因此無法精確匹配查詢對象時,可以在索引存儲節(jié)點的鄰近范圍搜索。
使用SICP計算句子索引的復雜度,如表1所示。
表1 計算復雜度Table 1 Computational complexity
表1中,M為詞向量維度,N為minhash過程中選取的哈希函數(shù)個數(shù),V為word2vec詞表的大小。其中,word2vec將關鍵詞轉為詞向量表示,本質上就是利用哈希表查值,故其時間復雜度為O(1)。由表1可知,SICP的時間復雜度為O(M×N),空間復雜度為O(M×V)。
圖3展示了一個由中心語句構建句子索引鍵值的示例。
圖3 句子索引構造過程Fig.3 Process of building sentence index
3.1.3 索引存儲
索引使用去中心化的方式存儲,利用DHT網(wǎng)絡存儲索引文件。本文中的DHT網(wǎng)絡基于Kademlia(KAD)算法實現(xiàn)。如圖4所示,DHT網(wǎng)絡中每個索引存儲節(jié)點都會存儲一個索引表及一個緩存表,并使用倒排表的結構對索引進行整合、存儲。DHT網(wǎng)絡中的節(jié)點提供索引存儲和搜索功能。
圖4 索引的存儲結構Fig.4 Storage structure of index
當網(wǎng)絡中的一個對等節(jié)點發(fā)起搜索時,首先根據(jù)查詢語句的長度判斷執(zhí)行句子索引或關鍵詞索引,還需要檢查緩存中的數(shù)據(jù),如果該節(jié)點自身緩存了搜索結果則直接返回結果并進行緩存的更新;其次,在搜索消息路由過程中,如果其他對等節(jié)點緩存了該搜索的結果,則中斷搜索并返回結果,否則對搜索消息進行轉發(fā)直到負責存儲該搜索結果的對等節(jié)點;然后,如果是關鍵詞索引,需要精確匹配關鍵詞哈希,如果是句子索引,無法精確匹配的情況下,因為相似內容的句子索引相鄰存儲,在存儲句子索引的節(jié)點附近進行搜索,搜索時會按照制定的規(guī)則添加搜索結果;最后,對搜索結果進行整合過濾,結束搜索并返回結果,發(fā)起搜索的對等節(jié)點將此次搜索及相關結果加入到它的緩存中。
此外,由于緩存空間有限,并不是所有節(jié)點都會緩存搜索結果。發(fā)布查詢的節(jié)點在收到目的節(jié)點發(fā)送的搜索結果時,會根據(jù)其與目的節(jié)點的距離決定是否對搜索結果進行緩存,只有當該節(jié)點的最近鄰節(jié)點或者若干路由跳數(shù)范圍內的節(jié)點沒有相關數(shù)據(jù)才進行緩存。如果緩存空間已滿,為了避免出現(xiàn)隨著緩存空間增大緩存的使用反而減少的情況,將采用最近最久未訪問算法對緩存結果進行置換,保證對熱數(shù)據(jù)的快速搜索,同時減少緩存的空間開銷。
如圖5所示,網(wǎng)絡中的一個對等節(jié)點發(fā)起搜索的執(zhí)行過程如下:
圖5 搜索流程圖Fig.5 Flow diagram of querying
(1)對等節(jié)點發(fā)起查詢時,對查詢語句進行分詞,判斷是否執(zhí)行句子索引,若判斷為是,則執(zhí)行步驟(2);若判斷為否,執(zhí)行步驟(4)。
(2)使用SICP計算查詢語句的160 bit哈希值,判斷緩存中是否存儲相關查詢結果,若判斷為是,則執(zhí)行步驟(6);若判斷為否,執(zhí)行(3)。
(3)執(zhí)行句子索引,若在索引存儲節(jié)點無法精確匹配的情況下,因為相似內容的句子索引相鄰存儲,在存儲句子索引的節(jié)點附近進行搜索,然后執(zhí)行步驟(6)。
(4)使用與建立關鍵詞索引同樣的哈希算法,計算查詢關鍵詞的160 bit哈希值,判斷緩存中是否存儲相關查詢結果,若判斷為是,則執(zhí)行步驟(6);若判斷為否,執(zhí)行步驟(5)。
(5)執(zhí)行關鍵詞索引,在索引存儲節(jié)點需要精確匹配存儲的關鍵詞哈希,然后執(zhí)行步驟(6)。
(6)發(fā)起查詢的對等節(jié)點得到搜索結果,更新緩存,結束查詢。
用于實驗的環(huán)境如下:操作系統(tǒng)為Windows 7旗艦版64位,Inter?Core?i5-3470 CPU@3.20 GHz,931 GB硬盤,12 GB內存,peersim版本為1.0.5,IntelliJ IDEA版本為2020.2.2。
本文使用peersim軟件在兩個數(shù)據(jù)集上進行了仿真實驗,一個是雅虎的匿名數(shù)據(jù)集[25],另一個是github上的數(shù)據(jù)集ChineseSTS[26]。雅虎數(shù)據(jù)集是對真實用戶的查詢進行匿名處理后得到的。ChineseSTS數(shù)據(jù)集中每一行數(shù)據(jù)會有兩個句子和一個相似度值,相似度值取值范圍為[0,5],0表示語義相反或不相干,相似度值越大表示兩個句子的相似度越高。
從ChineseSTS數(shù)據(jù)集抽取相似度值標記為4和5的數(shù)據(jù),選擇其中分詞后詞數(shù)大于等于3的數(shù)據(jù),得到相似數(shù)據(jù)對1 190對。使用SICP計算相似數(shù)據(jù)對的句子索引,計算每個相似數(shù)據(jù)對句子索引的切比雪夫距離[27]。在執(zhí)行句子索引時,會設置切比雪夫距離作為閾值,然后根據(jù)閾值在句子索引存儲節(jié)點的鄰近范圍搜索滿足條件的結果。圖6展示了相似數(shù)據(jù)對總數(shù)與切比雪夫距離的關系,其中91.34%的相似數(shù)據(jù)對的切比雪夫距離小于等于25。
圖6 相似數(shù)據(jù)對總數(shù)與距離關系圖Fig.6 Total number of similar data variation with distance
將每對相似數(shù)據(jù)對拆分成兩部分,分別是用于存儲的數(shù)據(jù)及用于搜索查詢的數(shù)據(jù),而且數(shù)據(jù)對中存在多對相似的情況。將1 190條數(shù)據(jù)建立句子索引并存入DHT網(wǎng)絡,另外1 190條數(shù)據(jù)用于搜索。首先,不使用句子索引,按照文獻[5]所述方法,將長查詢語句分詞后,對每個關鍵詞分別查詢,設置并行搜索數(shù)目為3,搜索滿足要求的數(shù)據(jù)。統(tǒng)計查詢語句的關鍵詞個數(shù)及搜索的平均網(wǎng)絡跳數(shù),得到結果如圖7所示。
圖7 網(wǎng)絡跳數(shù)隨關鍵詞數(shù)變化Fig.7 Hop number variation with keywords number
查詢語句中有117條語句的關鍵詞數(shù)3,對應的平均網(wǎng)絡跳數(shù)為19.78跳,當查詢語句的關鍵詞數(shù)為5時,對應的平均網(wǎng)絡跳數(shù)為33.06跳,隨著關鍵詞個數(shù)的增加,搜索網(wǎng)絡跳數(shù)也不斷增加。
使用句子索引,設置切比雪夫距離為20,并行搜索數(shù)目為3時,搜索滿足要求的數(shù)據(jù)。每個查詢語句的平均網(wǎng)絡路由為8.19跳。具體而言,在不同網(wǎng)絡跳數(shù)時,能搜索得到的結果數(shù)如圖8所示。
圖8 搜索結果數(shù)對應的網(wǎng)絡跳數(shù)分布Fig.8 Hop number distribution of search results
使用句子索引時,無需關心查詢語句的關鍵詞數(shù),每個查詢語句的平均網(wǎng)絡路由為8.19跳,而不使用句子索引查詢,即使關鍵詞數(shù)僅為3,也需要19.78跳,可見句子索引加快了對長查詢語句的搜索過程,減少了網(wǎng)絡負擔,實驗結果證明了本文提出的句子索引搜索方式的有效性。
從雅虎數(shù)據(jù)集中抽取1 500 000條數(shù)據(jù),對其建立關鍵詞索引,并將其索引信息存入DHT網(wǎng)絡。為測試改進存儲后的緩存所占空間進行了如下實驗,從1 500 000條數(shù)據(jù)中抽取1 000條數(shù)據(jù),然后對這1 000條數(shù)據(jù)隨機采樣10 000次,構成用于搜索的10 000條數(shù)據(jù),模擬重復查詢,其中數(shù)據(jù)的平均重復數(shù)為10。搜索結果如表2所示。
表2 在500個節(jié)點下的仿真實驗結果Table 2 Results of simulation experiment with 500 nodes
緩存空間表示節(jié)點緩存搜索結果的能力,例如5表示節(jié)點可以緩存5條搜索結果。緩存總數(shù)是指DHT網(wǎng)絡中所有節(jié)點緩存搜索結果的總數(shù)。為盡可能地貼近真實情況,在指定范圍內隨機選取干擾概率模擬節(jié)點的加入和退出網(wǎng)絡。因此在表2中,對10 000條數(shù)據(jù)進行搜索,而對應實際有效搜索次數(shù)卻低于10 000次。當緩存空間設為20時,DHT網(wǎng)絡所有節(jié)點的緩存空間為10 000,實際執(zhí)行的有效搜索為9 616次,按照文獻[5]及文獻[10]采用的緩存方式,此時緩存空間將使用9 616,而改進緩存存儲機制后,緩存空間使用了8 559,緩存占用空間減少了10.99%,實驗結果表明改進后的緩存機制,緩存占用空間更少,可以緩存更多的查詢結果。
為說明緩存空間、數(shù)據(jù)的平均重復數(shù)、緩存命中之間的關系,進行了如下實驗,從1 500 000條數(shù)據(jù)中抽取3 000條數(shù)據(jù),然后對這3 000條數(shù)據(jù)隨機采樣10 000次,構成用于搜索的10 000條數(shù)據(jù),其中數(shù)據(jù)的平均重復數(shù)為3.3。得到搜索結果與表2的結果進行對比,如表3所示。
表3 不同平均重復數(shù)的結果對比Table 3 Comparison results of different average duplicate data
平均重復數(shù)越大表示用于搜索的數(shù)據(jù)中重復查詢越多,即數(shù)據(jù)被頻繁搜索的次數(shù)越多。在表3中,緩存空間大小相同,數(shù)據(jù)平均重復數(shù)不同的,進行了三次對照實驗。無論緩存空間大小如何變化,平均重復數(shù)為10的緩存命中次數(shù)均約為平均重復數(shù)為3.3的實驗緩存命中次數(shù)的3倍。實驗結果表明緩存可以為被頻繁搜索的數(shù)據(jù)提供更好的搜索機制,可以保證對熱數(shù)據(jù)的快速搜索。實驗中,隨著節(jié)點緩存空間的增大,緩存命中次數(shù)也隨之增大,而搜索會在緩存命中時中斷,無需將搜索消息轉發(fā)到最終目的節(jié)點,因此,減少了消息轉發(fā)路由,加快了搜索過程。
本文鑒于目前在IPFS文件系統(tǒng)上缺乏有效的數(shù)據(jù)獲取方法,提出一種去中心化混合索引的IPFS數(shù)據(jù)獲取方法——IPFS-DDAM。實驗結果表明,本文方法IPFS-DDAM在句子搜索和關鍵詞搜索上都能有較好的表現(xiàn),加快了搜索過程,對緩存機制的改進,降低了緩存所占存儲空間。在未來的工作中將探索能否改進句子索引,使相似內容的句子索引存儲相鄰這一特性更加明顯,進一步提高搜索效率。