任洪敏 李 敏 赵要强 张敬周
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 结 语