手机版

基于Lucene的分布式并行索引(2)

发布时间: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();//创建一个文档

.(",

基于Lucene的分布式并行索引(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)