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