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

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

    即使是限定lucene只能使用一个线程进行写入操作,lucene的写入性能也是非常高效的,特别是在lucene4.x之后,更是优异,我们可以根据自己服务器的硬件环境,来调优一些参数,利用上批处理的特性,可以大大提升写入性能。

    前面说过,lucene写入时只能用一个线程操作,那么加入我们想使用多线程写入来提速可以吗?

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

    下面介绍如何使用luceneD的api来对多个索引文件进行合并操作,合并操作大多数时候要求我们的数据结构是一致的,当饭lucene是一种文档型的松散的存储结构,某个文档里也可以存储自己特有的字段,而其他的文档里,则没有,不多既然我们需要合并,那么就需要大多数的结构是要一致的,否则两个完全不同类型的索引,合并到一起是不符合逻辑的。

下面创建了2分索引,然后对这两份索引进行合并,截图如下:

Lucene4.3开发之第十步之渡劫后期(十)_第1张图片

Lucene4.3开发之第十步之渡劫后期(十)_第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();
		  }
	  }

生成第三份索引,截图如下:

Lucene4.3开发之第十步之渡劫后期(十)_第3张图片

我们来看下,合并前,1、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的,代表这个文档没有日期这个字段。

==============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

你可能感兴趣的:(Lucene)