3行にまとめると...
- リクエストされたドキュメントをメモリに蓄積して
- 一定量溜まったらセグメントと呼ばれる単位にまとめたあとに
- 検索用オブジェクトに反映される。
インデックス可能になるまでに行われていること
1. メモリバッファにドキュメントを蓄積
インデックスリクエストを受けたあと、すぐに格納されるわけではない。
メモリバッファに蓄積され、一定のドキュメント数が蓄積するかメモリバッファがいっぱいになると後述の格納処理が行われる。
2. セグメントへの格納 & マージ
Elasticsearch内部では全文検索ソフトウェアのLuceneが使用されており、
ドキュメント情報はLucene内部で セグメント と呼ばれる領域に分割して格納される。
ただし、この時点ではまだドキュメントを検索することはできない、
セグメントはサイズが一定を超えると複数のセグメントとマージされ、さらに大きいセグメントとなる。
このマージが繰り返されセグメントのサイズが大きくなっていく。
その様子をビジュアライズしたのが以下の動画。
http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html
3. Elasticsearchのrefreshを行い、検索用オブジェクトに反映
Luceneでドキュメントを検索可能な状態にするためには、 reopen という操作を行い検索用オブジェクトに反映する必要がある。
Elasticsearchのrefresh操作を行うと内部的にreopen操作が行われ、ドキュメントが検索可能な状態となる。
refresh間隔の設定
refresh間隔はデフォルトで 1秒
で行われる。
要件次第ではこの1秒が適切でないことがあり、 index.refresh_interval というプロパティを用いて任意の値に設定を行うこともできる。
要件ごとの設定については以下の記事が参考になる。
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/tune-for-indexing-speed.html#_unset_or_increase_the_refresh_interval
参考資料
Elasticsearch実践ガイド (impress top gear)
Elasticsearchの内部的な仕組み、運用方法など、非常にわかりやすい書籍。
本記事で説明した内容についてももっと詳しく記載されている。
Elasticsearchを実践導入するのであれば一度は読んでおきたい。
https://www.amazon.co.jp/dp/4295003913/