在本篇,咱们再来简单回顾下,IndexWriterConfig的做用。
java
IndexWriterConfig保存了一些运行时的配置参数,这些参数会在程序运行期间一直存在,因此在大多数时候咱们只须要一份单例的IndexWriterConfig便可,而IndexWriterConfig又是lucene内部实现的线程安全的类,因此在一些须要同步的场景时,咱们不必给IndexWriterConfig在应用外围,再加上本身的线程安全逻辑,IndexWriterConfig里面的IndexWriterConfig.setRAMBufferSizeMB(double)方法和IndexWriterConfig.setRAMBufferSizeDocs(int)方法,是2个比较重要的调优方法,通常状况下,咱们能够根据本身服务器的配置,来适当的加大这个参数的比值,经过更大的参数,来实现更给力的批处理添加,固然这个也得根据咱们的实际环境以及磁盘IO等等来定。安全
IndexWriter是负责建立和维护索引的重要的类,一些配置信息的获取主要来自IndexWriterConfig类,另外咱们还须要一个文件目录来存放索引,因此咱们常常看到以下代码:
服务器
IndexWriter writer=new IndexWriter(directory, writerConfig);
之因此说IndexWriter是一个很重要的索引管理类,不只仅是由于它提供基于操做索引的增删改查的能力,并且一个很重要的表现就是,它具备二阶段提交的事务能力,看源码咱们就会发现它实现了2个接口,一个Closeable接口和TwoPhaseCommit接口:性能
public class IndexWriter implements Closeable, TwoPhaseCommit{
正是因为TwoPhaseCommit接口,因此IndexWriter才具有了2阶段的事务功能,以及可恢复的回滚功能,这个功能,在某些突发的意外状况能够正确的保证索引结构的安全和稳定,即便是索引添加失败,也能够经过回滚功能,恢复上一次提交前的状态。spa
下面的是IndexWriter里面,比较重要和经常使用的几个方法:线程
最后,在唠叨几句,在上面的一些方法中,有几个方法时很是有用的,基本的增删改的那个就很少说了,除此以外还要注意的是,addIndexes(IndexReader... readers) 这个方法,由于lucene默认的任什么时候候都只能单线程写的局限性,因此在大批量建索引的时候,这多是一个影响的性能的环节,因此建议使用多个线程建索引,分别建在不一样的目录,那么最后就存在一个问题,咱们怎么合并索引? 这个时候就是这个方法大显身手的时候了,使用它能够建多份索引合并成一份索引,或许你还想提高性能,你也能够开启复合索引,但这个针对少写多读的场景是很是适合 的,若是更新频繁,那么并不适合使用复合索引。code
另一个forceMerge(int maxNumSegments) 这个方法,是合并索引里面段文件的方法,经过合并一些小段,能够用来,压缩空间,一样的对于提高性能也是有必定效果的,注意这个参数并非意味着越小越好,当咱们索引很大的时候,合并成多个段,也是一个不错的选择。 索引