0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

IndexWriterオブジェクト(一)

Posted at

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

インデックス目録のDirectory

Directoryを用いて目録に保存しているファイルを管理する。作成、削除、読み込みなどの抽象的なメソッドをDirectoryに定義されている。

IndexWriterのIndexWriterConfig

IndexWriterコンストラクタを呼ぶ前に、IndexWriterConfigを作成しなければならない。IndexWriterConfigには2種類の情報がある

  • 不可変更コンフィグ(unmodifiable configuration):IndexWriterのインスタンスを作成した後、変えられない内容
  • 変更可能コンフィグ(unmodifiable configuration):IndexWriterのインスタンスを作成した後、いつでも変えられる内容

不可変更コンフィグ

  不可変更コンフィグにはOpenMode、IndexDeletionPolicy、IndexCommit、Similarity、MergeScheduler、Codec、DocumentsWriterPerThreadPool、ReaderPooling、FlushPolicy、RAMPerThreadHardLimitMB、InfoStream、IndexSort、SoftDeletesFieldを含んでいる。

OpenMode

OpenModeはIndexWriterが作成する段階で、先に保存されているインデックスの処理策略だ。合わせて3つがある:CREATE、APPEND、CREATE_OR_APPEND。
● CREATE:インデックス目録にはもう保存されているインデックスがある場合、古いインデックスをオーバーライトする。ただし、新しいコミットで生成したSegment_NのNはラストコミットしたSegment_NのNを1でプラスされた値だ。以下の図1のように
image.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には主に2種類の情報があり、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策略である。策略には2つの種類がある:自動的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がある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?