Lucene4.3开发之第十步之渡劫后期(十)

    lucene的索引体系是一个写独占,读共享的结构,这就意味着,咱们在使用多线程进行添加索引时,性能并不会获得明显的提高,因此任什么时候候只能有一个线程对索引进行写入操做,而保障这个操做的安全性则是来自于,lucene的独占锁机制(写入操做进行时,咱们能够在lucene的索引根目录看到一个命名为write.lock的锁文件),若是同一时刻有多个不一样IndexWriter对索引进行写入操做,那么将会引起锁重叠异常,因此lucene的特殊索引结构,决定了其只能使用一个IndexWriter对索引进行添加操做。
java

    即便是限定lucene只能使用一个线程进行写入操做,lucene的写入性能也是很是高效的,特别是在lucene4.x以后,更是优异,咱们能够根据本身服务器的硬件环境,来调优一些参数,利用上批处理的特性,能够大大提高写入性能。
数据库

    前面说过,lucene写入时只能用一个线程操做,那么加入咱们想使用多线程写入来提速能够吗?
api

    答案是确定的,虽然lucene限定只能用一个线程写入,可是这个限制仅仅指的是对一个索引文件的限制,咱们能够采起一种折中的方式,利用多线程写入多个索引文件夹目录,而后再对这几个索引文件合并,由此来提高速度,lucene的api也支持多个索引文件的合并,因此采起这种方式来建立索引,也可以大大的提高索引性能,这种方式尤为适合对于数据库的数据建索引,咱们能够采起分页读的方式,由某个固定数目的线程来建立索引。
安全

    下面介绍如何使用luceneD的api来对多个索引文件进行合并操做,合并操做大多数时候要求咱们的数据结构是一致的,当饭lucene是一种文档型的松散的存储结构,某个文档里也能够存储本身特有的字段,而其余的文档里,则没有,很少既然咱们须要合并,那么就须要大多数的结构是要一致的,不然两个彻底不一样类型的索引,合并到一块儿是不符合逻辑的。
服务器

下面建立了2分索引,而后对这两份索引进行合并,截图以下:数据结构

合并的核心代码以下:
多线程

        /***
	 * 测试多个索引之间
	 * 进行合并的方法
	 * **/
	  public static void combineMoreIndex(){
		  
		  try{
		  Directory d1=FSDirectory.open(new File("E:\\1\\a"));//打开存放索引1的路径
		  Directory d2=FSDirectory.open(new File("E:\\2\\a"));//打开存放索引2的路径
		  
		  Directory d3=FSDirectory.open(new File("E:\\3\\ab"));//合并到索引3里面
		  
		   IndexWriter writer=new IndexWriter(d3, new IndexWriterConfig(Version.LUCENE_44, new IKAnalyzer()));
		  
		   writer.addIndexes(d1,d2);//传入各自的Diretory或者IndexReader进行合并
		   writer.commit();//提交索引
		   writer.close();
		   System.out.println("合并索引完毕.........");
		  
		  
		  }catch(Exception e){
			  e.printStackTrace();
		  }
	  }

生成第三份索引,截图以下:性能

咱们来看下,合并前,一、2索引和合并后的3索引的数据变化信息测试

  System.out.println("==============1a=========================");
		   showAll("E:\\1\\a");
		   System.out.println("==============2a=========================");
		   showAll("E:\\2\\a");
		   System.out.println("==============合并后=========================");
		   showAll("E:\\3\\ab");

输出结果以下,注意里面有日期为null的,表明这个文档没有日期这个字段。spa

==============1a=========================
a===>中国  日期: ===> null
b===>法国  日期: ===> 1389783935597
c===>中国  日期: ===> null
d===>英国  日期: ===> null
==============2a=========================
q===>中国  日期: ===> null
w===>法国  日期: ===> 1389783980586
r===>中国  日期: ===> null
d===>英国  日期: ===> null
==============合并后=========================
a===>中国  日期: ===> null
b===>法国  日期: ===> 1389783935597
c===>中国  日期: ===> null
d===>英国  日期: ===> null
q===>中国  日期: ===> null
w===>法国  日期: ===> 1389783980586
r===>中国  日期: ===> null
d===>英国  日期: ===> null
相关文章
相关标签/搜索