本篇簡要分析下IndexWriterConfig這個類的做用,IndexWriterConfig這個類並非一個頂級基類,在它上面還有一個父類LiveIndexWriterConfig,咱們先來分析下這個父類的一些做用,LiveIndexWriterConfig這個類是4.0之後新擴展的父類,在4.0以前並無這個類,那麼引入這個類的做用是什麼呢?
java
下面咱們先來看下LiveIndexWriterConfig裏面的部分源碼:安全
private final Analyzer analyzer; private volatile int maxBufferedDocs; private volatile double ramBufferSizeMB; private volatile int maxBufferedDeleteTerms; private volatile int readerTermsIndexDivisor; private volatile IndexReaderWarmer mergedSegmentWarmer; private volatile int termIndexInterval; // TODO: this should be private to the codec, not settable here // modified by IndexWriterConfig /** {@link IndexDeletionPolicy} controlling when commit * points are deleted. */ protected volatile IndexDeletionPolicy delPolicy; /** {@link IndexCommit} that {@link IndexWriter} is * opened on. */ protected volatile IndexCommit commit; /** {@link OpenMode} that {@link IndexWriter} is opened * with. */ protected volatile OpenMode openMode; /** {@link Similarity} to use when encoding norms. */ protected volatile Similarity similarity; /** {@link MergeScheduler} to use for running merges. */ protected volatile MergeScheduler mergeScheduler; /** Timeout when trying to obtain the write lock on init. */ protected volatile long writeLockTimeout; /** {@link IndexingChain} that determines how documents are * indexed. */ protected volatile IndexingChain indexingChain; /** {@link Codec} used to write new segments. */ protected volatile Codec codec; /** {@link InfoStream} for debugging messages. */ protected volatile InfoStream infoStream; /** {@link MergePolicy} for selecting merges. */ protected volatile MergePolicy mergePolicy; /** {@code DocumentsWriterPerThreadPool} to control how * threads are allocated to {@code DocumentsWriterPerThread}. */ protected volatile DocumentsWriterPerThreadPool indexerThreadPool; /** True if readers should be pooled. */ protected volatile boolean readerPooling; /** {@link FlushPolicy} to control when segments are * flushed. */ protected volatile FlushPolicy flushPolicy; /** Sets the hard upper bound on RAM usage for a single * segment, after which the segment is forced to flush. */ protected volatile int perThreadHardLimitMB; /** {@link Version} that {@link IndexWriter} should emulate. */ protected final Version matchVersion; /** True if segment flushes should use compound file format */ protected volatile boolean useCompoundFile = IndexWriterConfig.DEFAULT_USE_COMPOUND_FILE_SYSTEM;
看過以後,咱們就會發現這個類裏面,除了版本號和分詞器是普通的成員變量外,其餘field都有一個volite關鍵字修飾,從這個特色上,咱們其實就能夠看出點貓膩,這個類的主要做用,除了保存一個全局的配置信息外,其實就是抽象了一些IndexWriterConfig一些通用的全局變量,注意這個全局指的是基於jvm主存可見的,意思就是隻要這個類的某個屬性發生改變,那麼這個變化就會當即反映在主存中,這時候全部這個類的子類也就是IndexWriterConfig就會當即獲取最新的動態信息,從而作出相應的改變。
jvm
其中重要的方法有設置最大的文檔數、設置最大的緩衝大小,設置刪除合併策略,設置是夠開啓符合索引,以及設置一些自定義的打分策略等等。測試
IndexWriterConfig是LiveIndexWriterConfig的子類,裏面大部分field都是靜態的變量,這個類的做用直接集成自它的父類,也是起到一個全局配置的做用,給IndexWriter提供了一系列初始化的配置參數。this
下面重點說下,IndexWriterConfig裏面的一個靜態內部類OpenMode的做用。
spa
其實這個類裏面最重要的仍是它裏面的三個枚舉變量CREATE,APPEND,CREATE_OR_APPEND,另外此類還有2個方法values(),valueOf(String name)方法,前一個是返回全部的枚舉變量,後一個是構造指定名稱的OPENMODE,助於必須和三個枚舉同樣的字符串,纔有可能構形成功。debug
下面來講明這三個枚舉常量的做用:code
CREATE模式:這個模式下,每次新建的索引都會先清空上次索引的目錄,而後再新建當前的索引,注意能夠不用事先建立索引目錄,這個模式通常是測試時候用的。orm
APPEND模式:這個模式下,每次新添加的索引,會被追加到原來的索引裏,有一點須要注意的是,若是這個索引路徑不存在的話,這個操做將會致使報出一個異常,因此,使用此模式前,務必肯定你有一個已經建立好的索引。索引
CREATE_OR_APPEND模式:這個模式就是咱們默認的模式,也是比較安全或比較通用的模式,若是這個索引不存在,那麼在此模式下就會新建一個索引目錄,若是已存在,那麼在添加文檔的時候,直接會以Append方式追加到索引裏,因此此模式下,並不會出現一些意外的的狀況,因此大多數狀況下,建議使用此模式,進行構件索引。