IndexWriterオブジェクト（一）


このシーリズの文章は、IndexWriterを構造する流れを紹介します。主に３つの部分があります：
● インデックス目録のDirectoryをセットする
● IndexWriterのIndexWriterConfigをセットする
● IndexWriterコンストラクタを呼ぶ

# インデックス目録のDirectory
Directoryを用いて目録に保存しているファイルを管理する。作成、削除、読み込みなどの抽象的なメソッドをDirectoryに定義されている。
# IndexWriterのIndexWriterConfig
IndexWriterコンストラクタを呼ぶ前に、IndexWriterConfigを作成しなければならない。IndexWriterConfigには２種類の情報がある
- 不可変更コンフィグ（unmodifiable configuration）：IndexWriterのインスタンスを作成した後、変えられない内容
- 変更可能コンフィグ（unmodifiable configuration）：IndexWriterのインスタンスを作成した後、いつでも変えられる内容
# 不可変更コンフィグ
  不可変更コンフィグにはOpenMode、IndexDeletionPolicy、IndexCommit、Similarity、MergeScheduler、Codec、DocumentsWriterPerThreadPool、ReaderPooling、FlushPolicy、RAMPerThreadHardLimitMB、InfoStream、IndexSort、SoftDeletesFieldを含んでいる。
## OpenMode
OpenModeはIndexWriterが作成する段階で、先に保存されているインデックスの処理策略だ。合わせて３つがある：CREATE、APPEND、CREATE_OR_APPEND。
● CREATE：インデックス目録にはもう保存されているインデックスがある場合、古いインデックスをオーバーライトする。ただし、新しいコミットで生成したSegment_NのNはラストコミットしたSegment_NのNを１でプラスされた値だ。以下の図1のように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648622/fb44b077-ed32-20b7-ee81-967c247c392b.png)

● APPEND：インデックス目録を開くとき、まずは保存されているインデックスを読み込み、新たなコミットは古いSegmentを削除しない。ただし、APPENDを使うと、インデックス目録には既存インデックスはないだとエーラメッセージが発生する。throw new IndexNotFoundException("no segments* file found in " + directory + ": files: " + Arrays.toString(files));
● CREATE_OR_APPEND：もし保存されているインデックスがある場合、APPENDを使う。そうではないと、CREATEを使う。
デフォルトバリューはCREATE_OR_APPENDである。
## IndexDeletionPolicy
IndexDeletionPolicyはインデックス削除策略。この策略は新たなコミュートが発生した後、ラストコミュートの処理を定義する。
## IndexCommit
一つのコミュートをした後、今回のコミュートに関する情報がIndexCommitを用いて保存されている。IndexCommitには主に２種類の情報があり、Segment_NとDirectoryである。IndexCommitはIndexWriterConfig.setIndexCommit(IndexCommit commit)を通じてアルゴリズムを設定することができる。デフォルトバリューはnullである。
## Similarity
SimilarityはLuceneスコア表示の部分である。SimilarityはIndexWriterConfig.setSimilarity(Similarity similarity)を通じてアルゴリズムを設定することができる。デフォルトアルゴリズムはBM25である。
## MergeScheduler
MergeSchedulerは一つや多数のSegmentの合併処理を定義する。IndexWriterConfig.setMergeScheduler(MergeScheduler mergeScheduler)を通じて設定することができる。デフォルトバリューはConcurrentMergeSchedulerである。
## Codec
Codecはインデックスファイルのデータストラクチャを定義する。具体的には、各種類のインデックスファイルにはどんな情報が必要かや、保存方法などを定義する。CodecはIndexWriterConfig.setCodec(Codec codec)通じて設定することができる。デフォルトバリューはLucene70Codecである。
## DocumentsWriterPerThreadPool
  DocumentsWriterPerThreadPoolはロジック的なスレッドプールで、Javaスレッドプールに似てるファンクションを実装している。Javaスレッドプールには、新たなタスクはExecutorServiceから一つのスレッドを獲得し、タスクを実行する。DocumentsWriterPerThreadPoolには、IndexWriterはファイルをアッドすると、DocumentsWriterPerThreadPoolから一つのThreadStateを獲得し、タスクを実行する。その故、各スレッドにはThreadStateのインスタンスを持ちる。
## ReaderPooling
ReaderPoolingはブーリアンである。SegmentReaderの使用かを決める。SegmentReaderはCacheみたいに、主にパフォーマンスのために使われている。ReaderPoolingはIndexWriterConfig.setReaderPooling(boolean readerPooling)を通じて設定することができる。デフォルトバリューはtrueである。
## FlushPolicy
FlushPolicyはflush策略である。策略には２つの種類がある：自動的flushと非自動的flush。すなわち、IndexWriter.flush( )を使う策略である。Lucene7.5.0にはFlushByRamOrCountsPolicyという策略しかない。
## InfoStream
InfoStreamはdebugに関する設定である。普段は性能のせいで使わない。InfoStreamはIndexWriterConfig.setInfoStream(InfoStream infoStream)を通じて設定することができる。デフォルトバリューはNoOutputである。
## IndexSort
IndexSortはインデックス段階で、segment内のファイルのソーティング方法を定義する。IndexSortはIndexWriterConfig.setIndexSort(Sort sort)を通じて設定することができる。デフォルトバリューはnullである。
## SoftDeletesField
SoftDeletesFieldはソフトデェリートに関する設定である。IndexSortはIndexWriterConfig.setSoftDeletesField(String softDeletesField)通じて設定することができる。デフォルトバリューはnullである。
# 可变配置
  変更可能配置には：MergePolicy、MaxBufferedDocs、RAMBufferSizeMB、MergedSegmentWarmer、UseCompoundFile、CommitOnClose、CheckPendingFlushUpdateがある。