Lucene4.3進階開發之漫漫修行( 四)

    本篇簡要分析下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方式追加到索引裏,因此此模式下,並不會出現一些意外的的狀況,因此大多數狀況下,建議使用此模式,進行構件索引。

相關文章
相關標籤/搜索