Field.Index.NO));//向文档中添加域
doc.add(newField("title",title,Field.Store.YES,Field.Index.ANALYZED));
doc.add(newField("content",newFileReader(f)));ramWriter.addDocument(doc);//向内存索引中加入文档并索引docs_in_ram++;//加入内存中的文档数,初始值为零,内存中每加一文档,其值加1。如果在内存中的文件总数docs_in_ram大于设定的内存阈值max_docs_in_ram,触发flush()方法:if(docs_in_ram>=max_docs_in_ram){flush();}}
3)当写入内存中的待索引文件数达到设定的最大值时,触发flush()事件,调用fsWrite,将存放在ram Directory中的索引文件写入fsDirectory中,并清空内存,对存入fsDirectory中的索引文件进行优化。
privatestaticvoidflush(){ramWriter.optmiize();
ramDirectory=ramWriter.getDirectory();fsWriter.addIndexes(ramWriter.getReader());
ramWriter.close();Analyzeranalyzer=newIKAnalyzer();ramWriter=newIndexWriter(ramDirectory,dexWriter.MaxFieldLength.LIMITED);docs_in_ram=0;}
analyzer,true,In
4)ramWriter再读取新的待索引文件,重复步骤2、3,直到所有的待索引文件都索引完毕并存入到FSDi rectory中,关闭索引器ramWriter和fsWrite,索引结束。1.2 分布式并行索引的实现方法和关键算法
分布式并行索引系统由一台高性能的搜索服务器和多台PC机构成,每台PC机根据总控系统分配的任务,并行完成任务。搜索服务器利用高内存和大硬盘完成PC机上传来的索引文件,并完成索引文件的合并和总索引文件的更新工作
[11,12]
图1 分布式并行索引合并算法流程图
2 实验结果与分析
分别对不同待索引文件数在不同索引技术下建立索引进行了对比试验(实验环境:Windowsxp;CPU主频:1.67GHz;内存:1G)。
结果显示:当待索引文件比较少时,在采用磁盘索引技术或内存-磁盘索引技术下建立索引的时间效率相差不大,而采用以内存为缓冲区建索引文件的分布式并行索引方法时时间效率反而会下降;随着索引文件的增多,采用内存-磁盘技术和以内存为缓冲区建索引文件的分布式并行索引技术的优势变得越来越明显,当索引文件达到一定等级时,尤以以内存为缓冲区建索引文件的分布式并行索引技术的优势更为明显。
实验结果如表1所示。
表1 索引时间对照表(秒)
文件数100010000300000
磁盘索引54.485384.21810086.54
内存-磁盘索引
50.578369.9539558.59
分布式并行索引
54.851214.5394808.857
。文中所述的分布
式并行索引的实现就是根据上述分布式并行索引系统的原理在硬件的基础上,利用Lucene自带的addIndex es()函数来实现合并索引的。具体实现思路是:每台PC机采用内存-磁盘索引技术根据总控分配的任务建立并优化自己的索引文件,上传到服务器上对应自己的目录,服务器保留一个用于合并的目录,当PC机向服务器上传文件后,服务器就采用addIndexes函数合并索引。例如,采用2台PC机做并行索引,那么就有3个目录build_index,build_index1,build_index2,PC1往build_index1中上传,PC2往build_index2中上传,最后服务器将目录build_index1、build_index2的索引合并到build_index目录中。合并算法流程图如图1
所示。