任洪敏 李 敏 趙要強 張敬周
1(上海海事大學計算機系 上海 200135) 2(青島西海岸新區管委會 山東 青島 266555) 3(上海神開石油設備有限公司 上海 201114) 4(上海上科信息技術研究所 上海 201206)
修訂限定的SVN全文檢索系統研究與實現
任洪敏1李 敏2趙要強3張敬周4
1(上海海事大學計算機系 上海 200135)2(青島西海岸新區管委會 山東 青島 266555)3(上海神開石油設備有限公司 上海 201114)4(上海上科信息技術研究所 上海 201206)
針對SVN版本倉庫數據檢索困難問題,開發一個基于Lucene的SVN全文檢索系統。結合版本控制管理工作特點,提出兩種修訂限定的SVN全文檢索方式。設計版本限定的SVN全文檢索系統體系結構,給出基于Lucene過濾器的版本限定實現算法,描述系統的關鍵實現技術。該系統提供了便捷的SVN全文檢索功能,提升了SVN文檔資源的檢索效率。
Subversion SVN Lucene 全文檢索
Subversion[1](SVN)是一款主流的、開源的版本控制系統。SVN允許用戶在各自的空間修改和管理同一組數據,記錄數據修改情況,并可以籍此將數據恢復到以前的版本與查看數據的修改細節。SVN促進開發團隊協作,實現版本控制管理,具有強大的功能和廣泛的應用,但SVN與其客戶端軟件如WebSVN[2]、TortoiseSVN[3]等并不提供SVN文件庫的全文檢索功能。當用戶需要某個文檔資料但不知其具體的存儲位置與版本時,用戶只能逐個修訂版本、逐個文件路徑采用手動的方式瀏覽尋找。伴隨SVN文檔庫中文檔資源的數量和修訂版本號碼的增加,通過手動的方式找出所需要文檔資料的難度大大增加,查找資料浪費的時間大大增加。
Lucene是一個知名的開放源代碼全文檢索引擎[4],但Lucene并不支持版本化數據的全文索引和索引文檔的版本化管理。因此,針對SVN的文檔版本管理機制與修訂版本的變更情況,需要一種基于Lucene的高性能的SVN文檔庫全文檢索系統。該系統不僅能夠實現全文檢索自身支持的與、或、非、相鄰等檢索邏輯運算。同時需要能夠面向版本管理數據的特點,提供與特定版本相關的全文檢索機制,以提升SVN文檔資源的檢索效率。
SVN系統采用全局修訂版本號、版本差異保存和混合修訂版本機制[5],各修訂版本間通常存在大量相同的文檔和少量發生變更的文檔。通常一個修訂版本中包含一系列不同修訂版本的各個文檔。與此對應,該修訂版本中各個文檔的全文索引數據應該同樣分散存在于不同修訂版本的全文索引文檔之中。否則,如果為每個修訂版本快照中的文件建立統一、集中獨立的索引文檔,雖然方便了版本限定的檢索方式,但會導致大量的索引數據冗余和系統運行的性能負擔。因此,提供版本限定的SVN全文檢索功能,雖可方便用戶使用,增強系統檢索能力,但卻具有一定的挑戰。
據此,基于Lucene全文索引引擎,結合SVN版本化數據機制,本文提出了一種高性能的SVN全文索引方法,實現SVN文件庫的全文檢索,支持版本限定的SVN全文檢索機制,提升SVN文檔資源的檢索效率。
SVN全文索引檢索機制通常不考慮SVN版本限定問題,即在版本庫中全體修訂版本、全部文檔集中進行檢索。限定修訂版本號碼的SVN全文索引檢索機制,即用戶在檢索時給定SVN的修訂版本號,作為檢索條件,進行檢索結果限定。具體包括兩種修訂檢索限定機制:
(1) 僅在SVN文件庫中該特定修訂版本快照中的全體文件范圍中進行全文檢索,而不是版本庫中全部修訂版本中的所有文檔集中進行檢索。
(2) 僅在該特定修訂版本與其前一修訂版本相比發生變更的文檔集中進行全文檢索,而不是在該特定修訂版本快照的全體文檔集中進行檢索。
SVN每一修訂版本邏輯上包含版本化數據的全部文檔,包括發生變更的文檔和未發生變更的文檔,但通常各修訂版本中僅有少量部分的文檔發生變更。針對每一修訂版本,需對發生變更的文檔建立全文索引,實現版本數據的增量化索引,其不僅降低索引文件占用的空間,而且提升版本庫全文索引的建立時間和全文檢索的性能。
為了支持修訂限定的版本檢索機制,需要根據針對變更文檔集建立的增量化索引,動態重構該修訂版本整體文檔集對應的索引文檔。本文利用Lucene索引框架的filter機制[6],針對各修訂版本,建立自定義的、持久化并且內存緩存的Lucene filter。該filter運用BitSet從Lucene索引文檔集中標識屬于該修訂版本的索引文檔,實現限定修訂版本號整體文檔索引文件的動態重構。
據此,給出修訂限定的SVN全文檢索系統的總體系統體系結構(圖1)。其中,SVN提交偵測模塊,基于SVN的事件捕獲機制,與SVN版本庫交互,偵測SVN文件庫中文件的新增與更新變化,具體包括SVN的Import和Commit操作。當發現SVN文件庫變化時,啟動SVN變更文檔集提取模塊,調用SVN版本庫的接口方法,從SVN版本庫獲取本版本提交更新的文檔集,并把更新的文檔集傳遞給變更文檔集全文索引模塊。然后調用Lucene的索引機制,對變更文檔集進行全文索引。每個變更文檔的Lucene索引必須包含三個字段:(1) 版本修訂號,用于所索引存貯文檔的修訂版本號;(2) 文件完整路徑,用于存貯所索引文檔在SVN版本庫中的路徑與文件名;(3) 文檔的索引內容,用于對文檔的內容進行索引與存貯。

圖1 修訂限定的SVN全文檢索系統體系結構
當SVN版本庫中的版本變更時,修訂版本過濾器構建模塊獲取發生變更的文檔,構建該修訂版本的Lucene檢索文檔過濾器。該過濾器運用BitSet表達與存貯Lucene索引文檔庫中僅屬于該修訂版本的文檔,用于Lucene檢索引擎對特定修訂版本的索引文檔進行過濾,實現特定修訂限定的文檔檢索,其內部實現算法見2.1節。
SVN全文檢索執行時,可調用修訂版本更新文件過濾器構建模塊。該模塊獲取相鄰兩個修訂版本的檢索過濾器,動態構建兩個版本間發生變更文檔集的過濾器,以支持僅在版本間發生變更的文檔集中進行全文檢索,其內部實現算法見2.2節。
SVN全文索引啟動模塊負責整個系統的初始化啟動。SVN全文檢索執行模塊接受用戶的檢索請求,根據用戶的選擇,獲取相應的版本限定檢索過濾器,訪問Lucene索引與檢索庫,執行用戶要求的全文檢索,全文檢索的結果傳遞給檢索結果顯示模塊。
修訂限定檢索機制的核心是根據修訂版本的增量化文檔集全文索引,動態構建該修訂版本的整體文檔集或其更新文檔集的Lucene過濾器。
2.1 修訂限定過濾器構建
算法1為修訂版本限定過濾器構建算法。該算法運用遞推思想,基于前一修訂版本的限定過濾器和當前修訂版本中文檔變更情況,構建當前修訂版本的文檔限定過濾器。Lucene過濾器采用BitSet設置索引庫中各文檔是的否應被過濾。算法運行的初始基礎即修訂版本0的文檔檢索過濾器,其BitSet的各位皆設置為false。
算法1修訂版本限定過濾器構建算法
Input:需要構建過濾器的修訂版本號revNo。
Output:revNo版本的修訂限定檢索過濾器。
Begin:
獲取變更文檔的URL數組列表changedDocUrls;
獲取變更文檔的數量changeddocNo=changedDocUrls.size();
獲取修訂版本號revNo-1的過濾器prevBitSet;
獲取prevBitSet的位數preSetSize=prevBitSet.size();
// 設置curBitSet中0…preSetSize位的值
curBitSet=new BitSet(preSetSize+changeddocNo);
for(int i=0;i //設置curBitSet中變更文檔對應位為false foreach(url in changedDocUrls){ //于lucene索引庫中查找其path field的值為url的文檔, //獲得其文檔編號docId; if(curBitSet.get(docID)) curBitSet.set(docID,false); } //設置curBitSet中preSetSize…preSetSize+changeddocNo-1 //位的值 for(int i=preSetSize;i //返回構建的當前更新版本的過濾器 return curBitSet; End 該算法首先獲取當前需要構建過濾器的修訂版本號revNo、獲取當前修訂版本與前一修訂版本相比發生變更文檔的url數組列表changedDocUrls,得到發生變更文檔的數量,設為changeddocNo。從修訂版本過濾器存貯體系中獲取所存貯的前一修訂版本的限定過濾器,設為prevBitSet,基于該過濾器遞推構建當前修訂版本過濾器。 然后初始化創建當前修訂版本的過濾器,設為curBitSet。因Lucene索引庫新增加了變更的changeddocNo個文檔,故其長度應為preSetSize+changeddocNo。基于前一修訂版本過濾器prevBitSet設置curBitSet中前preSetSize位的初始值,保持與prevBitSet過濾器中各對應值一致,因版本間大部分文檔未發生變更。針對每個變更文檔的url,查找Lucene索引庫,于索引文檔庫中找到相應索引文檔及其文檔編號docId。 如果在curBitSet中對應位置為true,則表明該文檔屬于前一修訂版本,現在該文檔已發生變更具有新版本,故其不屬于當前版本的文檔集,所以過濾器對應文檔位置設置為false。 最后,針對新變更文檔進行增量化索引存貯,其于限定過濾器curBitSet中的對應位置是preSetSize…preSetSize+changeddocNo-1。該部分文檔全部屬于當前修訂版本的索引文檔,故過濾器中相應各位全設置為true。至此,修訂限定過濾器構造完畢。 2.2 修訂更新文件限定過濾器構建 算法2為修訂版本更新文件限定過濾器構建算法。該算法基于用戶提供的修訂版本號,構建與前一修訂版本相比所發生變更文檔的檢索過濾器。 算法2修訂版本更新文件限定過濾器構建算法 Input:需要構建修訂更新過濾器的修訂版本號revNo。 Output:revNo版本的修訂更新文件限定檢索過濾器。 Begin: 獲取修訂版本號revNo-1的過濾器prevBitSet; 獲取prevBitSet的位數preSetSize=prevBitSet.size(); 獲取修訂版本號revNo的過濾器curBitSet; 獲取curBitSet的位數curSetSize=curBitSet.size(); 獲取最大修訂版本號的過濾器maxBitSet; 獲取maxBitSet的位數maxSetSize=maxBitSet.size(); //初始生成revNo的更新文檔過濾器updateBitSet updateBitSet=new BitSet(maxSetSize) //設置updateBitSet中0…preSetSize-1位的值 for(int i=0;i //設置updateBitSet中preSetSize…curSetSize-1位的值 for(int i=preSetSize;i //設置maxBitSet中curSetSize…maxBitSize-1位的值 for(int i=curSetSize;i //返回構建的修訂版本更新文檔過濾器 return updateBitSet; End 該算法首先是數據的獲取與讀取,具體包括獲取用戶請求限定的修訂版本號,設為revNo;獲取修訂版本號revNo-1的過濾器prevBitSet,其長度設為preSetSize;獲取修訂版本號revNo的過濾器curBitSet,其長度設為curSetSize;獲取最大修訂版本號的過濾器,設為maxBitSet,其長度設為maxSetSize。maxSetSize代表了Lucene索引庫中所索引文檔的總數。本算法將根據prevBitSet、curBitSet和maxBitSet構建修訂版本的更新文檔過濾器。 然后,初始化生成revNo的更新文檔過濾器,設為updateBitSet,其長度為maxSetSize。Lucene索引庫中前preSetSize個文檔,為revNo修訂版本或更前面修訂版本的文檔,故不是revNo修訂版本的更新文檔,故設置updateBitSet中相應位的值為false。Lucene索引庫中對應于preSetSize…curSetSize位置間的文檔,為revNo修訂版本發生變更的文檔,故設置updateBitSet中相應位的值為true。Lucene索引庫中對應于curSetSize…maxBitSize-1位置間的文檔,是revNo之后修訂版本新增加的索引文檔,不是revNo修訂版本的更新文檔,故設置updateBitSet中相應位的值為false。 最后返回該修訂版本更新文件限定過濾器updateBitSet,供Lucene匹配引擎使用。 本系統采用B/S架構實現,前臺使用HTML、CSS和JavaScript語言和jQuery、jQuery Easy UI框架,基于AJAX技術調用后臺Java服務,驅動Lucene全文檢索引擎訪問SVN倉庫執行索引與檢索。系統在4 GB內存、AMD CPU 2.1 GHz、Lucene4.7、poi-3.11、Svnkti-1.8.7環境下測試。針對200個、450 MB文件進行測試,建立索引時間66.235秒,索引文件3.7 MB,全文檢索時間0.041秒,系統具有良好的時間執行性能。 本系統實現的關鍵技術包括: (1) 基于SVNKit的SVN倉庫訪問操作[7] SVNKit是一款開源的、純 Java的 SVN版本控制系統的二次開發軟件包,提供豐富的API實現SVN倉庫的創建、加載、檢出、提交、更新、版本差異比較、版本文件讀取等系列功能。利用SVNKit的高層API接口SVNClientManager,調用其getDiffClient()方法獲取SVNDiffClient的實例,獲得修訂版本的變更文檔集,并對每一個變更的文檔應用SVNRepository的getFile()方法進行讀取,傳遞給Lucene以實現增量化索引。 (2) Office文檔和PDF文檔內容提取與索引[8] Lucene自身提供的索引分析器不能有效處理Office文檔和PDF文檔。POI和PDFBox軟件包皆是Apache軟件基金會提供的開源的、純Java的Office文檔、PDF文檔讀寫操作的軟件包,具有強大、完善的Office文檔和PDF文檔讀寫和轉化功能。利用POI和PDFBox提取SVN版本倉庫中的Office文檔和PDF文檔的文本內容流,從而對其實現全文索引。 (3) 基于NLPIR的中文分詞處理[9] NLPIR是中國科學院計算技術研究所經過多年的研發而成供開發出的一款漢語詞法分析系統。NLPIR主要功能包括中文分詞、命名實體識別、用戶詞典和詞性標注功能。利用NLPIR的分詞功能對SVN倉庫中的文檔的內容進行分詞,同時過濾掉沒有必要進行索引的無意義的詞匯語句,從而減少數據冗余,提高索引與檢索效率。 SVN是一款開源的、廣泛應用的版本控制系統。伴隨SVN文檔庫中文檔資源數量的積累和增加,從中進行資源文件的查找變得困難。Lucene是一個知名的開放源代碼全文檢索引擎。據此,本文提出了一個基于Lucene的SVN全文檢索系統,并針對版本化數據特點,提出了兩種修訂限定的全文檢索方式和實現算法,給出了系統實現的關鍵技術。該系統提供便捷的SVN系統全文檢索功能,同時能夠基于修訂限定檢索的范圍與檢索結果,提升SVN文檔資源的檢索效率。 [1] 高平,周磊.版本控制系統——Subversion技術及其在軟件開發庫的應用[J].航空電子技術,2013(1):24-28. [2] Liu C,Ye X,Ye E.Source Code Revision History Visualization Tools:Do They Work and What Would it Take to Put Them to Work?[J].IEEE Access,2014,2:404-426. [3] 崔詩程,李千目,戈峰,等.基于Lucene的全文檢索架構設計[J].南京理工大學學報(自然科學版),2015,39(6):692-697. [4] WebSVN-Online subversion repository browser[OL].http://www.websvn.info/. [5] Ben Collins-Sussman,Brian W Fitzpatrick,C Michael Pilato.Version Control with Subversion[M].O’Reilly Media,2008. [6] 劉妍.Lucene過濾搜索原理及編程實踐研究[J].電腦編程技巧與維護,2015(2):22-23. [7] 陳燮.基于SVNKIT的大型企業應用系統變更管理[J].計算機光盤軟件與應用,2014(18):100-102. [8] 孔浩,高琴,姜娜.高校URP中基于POI設計實現數據交換中間件[J].陜西理工學院學報(自然科學版),2013(4):39-42. [9] 義天鵬,陳啟安.基于Lucene的中文分析器分詞性能比較研究[J].計算機工程,2012(22):279-282. RESEARCHANDIMPLEMENTATIONOFAREVISION-RESTRICTEDSVNFULL-TEXTRETRIEVALSYSTEM Ren Hongmin1Li Min2Zhao Yaoqiang3Zhang Jingzhou4 1(DepartmentofComputerScienceandTechnology,ShanghaiMaritimeUniversity,Shanghai200135,China)2(QingdaoWestCoastNewAreaAdministrativeCommittee,Qingdao266555,Shandong,China)3(ShanghaiShenkaiPetroleumEquipmentCo.,Ltd,Shanghai201114,China)4(ShanghaiShangkeInformationTechnologyResearchInstitute,Shanghai201206,China) Aiming at the problem of data retrieval from SVN version repositories, an SVN full-text retrieval system is developed based on Lucene indexing and search technology. Combining with the characteristics of version control management, two revision-restricted SVN full-text retrieval methods was proposed. Then the system architecture of revision-restricted SVN full-text retrieval system is defined, the essential algorithms and realization mechanisms are described based on Lucence filters. The system provides convenient full-text retrieval function for SVN repositories and improves the SVN document resources search efficiency as well. Subversion SVN Lucene Full-text retrieval 2017-02-17。上海海事大學高級軟件工程精品課程建設項目(2012YQ15000103)。任洪敏,副教授,主研領域:軟件工程。李敏,碩士。趙要強,高工。張敬周,研究員。 TP311 A 10.3969/j.issn.1000-386x.2017.11.0163 系統實現
4 結 語