基于Lucene的分布式并行索引(2)
发布时间:2021-06-08
发布时间:2021-06-08
124 计算机技术与发展 第21卷
个子项目,具有结构完整、层次分明、可扩展性好等特征,它还提供了比较完善的API文档,给软件开发人员在目标系统中实现全文检索功能带来了极大的便利。同时,Lucene还具有面向对象和平台无关性 将系统的核心部分封装成抽象类或接口,具体的平台实现设计成抽象类或接口的实现,是一个低耦合、高效率、容易二次开发的全文检索引擎架构。Lucene作为一个优秀的全文检索引擎架构,采用高度优化的倒排索引结构
[3~7]
用户计算机内存大小的限制,需先设定能够载入内存的待索引文件数的最大值,然后将待索引文件写入到内存中建立索引,并将索引文件写入到RAMDirectory中,当待索引文件数达到最大值时,刷新内存,将RAMDirectory中的索引文件批量的写入FSDirectory中,这样既减少了I/O操作次数,又避免了不能长期储存的问题,最终也达到了提高索引速度的目的具体实现步骤及实现代码如下:
1)建立两个索引器(ramWriter和fsWriter)。ramWriter用于索引存放在内存路径RAMDirectory下的待索引文件;fsWriter用于索引存放在本地磁盘FSDirectory下的待索引文件。
DirectoryramDirectory=newRAMDirectory();DirectoryfsDirectory=FSDirectory.open(indexDir);为索引存入的磁盘目录
Analyzeranalyzer=newIKAnalyzer(); IndexWriterramWriter=nul;lIndexWriterfsWriter=nul;lramWriter=
newIndexWriter(ramDirectory,analyzer,true,In
dexWriter.MaxFieldLength.LIMITED);
fsWriter=newIndexWriter(fsDirectory,analyzer,true,IndexWrit er.MaxFieldLength.LIMITED);
//indexDir
[9,10]
。
,大大的提高了检索效率。但是Lucene存
在着一个有待改进的缺点:待索引文件越多,所需的索引时间越长,并且所需的时间是成几何级数增长的,当待索引文件数达到一定等级时,搜索引擎就会遇到性能瓶颈。
针对上述问题,在深入分析和研究Lucene索引机制的基础上,采用软硬件相结合、内存和磁盘相结合的方法,提出了一种以内存为缓冲区建索引文件的分布式并行索引技术,有效的缓解了建索引时给搜索带来的瓶颈问题。
1 分布式并行索引技术的实现过程及关键算法
1.1 内存-磁盘索引技术的实现方法及关键算法
Lucene中定义了用于存储索引的目录类型Direc tory。Directory是一个抽象类,具有两个子类:RAMDi rectory和FSDirectory。FSDirectory是文件系统路径,是磁盘中的一块区域,当Lucene向其中写人索引时,会将索引写在对应的那块磁盘上。FSDirectory的缺点是:I/O操作频繁,索引写入速度慢。RAMDirectory是内存中的一块区域,当Lucene向其中写入索引时,是直接将索引写到内存中,所以不需要进行频繁的I/O操作,写入速度较快;不过受到内存大小的限制,它不能像FSDirectory那样一次性索引完所有的文件,而是根据计算机的内存大小,分批进行索引
[8]
2)ramWriter索引待索引文件。
FiledataDir=newFile(DATA_DIR);//DATA_DIR为待索引文件目录
privatestaticvoidindexDirectory(Filedir)throwsException{ File[]htmls=dir.listFiles();
for(inti=0;i<htmls.length;i++){
Filef=htmls[i];
if(.fisDirectory()){//如果文件对象是一个目录
}elseif(.fgetName().endsWith(".html")||.fgetName().
indexDirectory(f);
endsWith(".htm")){//获取文件后缀名为.html或.hml的文件indexFile(f);}}
privatestaticvoidindexFile(Filef)throwsException{//将文件载入内存中进行索引 }
StringhtmlPath=.fgetAbsolutePath();
//将带索引的html文件进行预处理DocParserdocParser=newDocParser(htmlPath);if(.fisHidden()||!
fexists()||!.
fcanRead()){.
return;
。
FSDirectory与RAMDirectory之间存在性能差别的根源是:FSDirectory要与磁盘进行交互,所以要频繁的进行I/O操作,导致索引速度较慢,而RAMDirectory直接将索引文件写人内存,无需进行频繁的I/O操作,所以索引速度较快。但是基于RAMDirectory的索引缺点就是不能长期储存 索引程序一旦关闭,基于RAMDirectory的索引就会马上消失。
根据Lucene中FSDirectory和RAMDirectory的定义可知,这两种目录类型各有优缺点。单独使用FSDi rectory或RAMDirectory进行索引都不能充分发挥这两个目录类型的作用。因此,本文结合了这两种目录类型的优点,即分别建立了FSDirectory和RAMDirectoryRAD
Stringpath=docParser.getPath(); Stringtitle=docParser.getTitle();Readercontent=docParser.getContent();
Documentdoc=newDocument();//创建一个文档
.(",
上一篇:人教版小学语文三年级下册教学计划