ほぼリアルタイム検索

ドキュメントがElasticsearchに保存されると、それはインデックスされ、ほぼリアルタイムで検索可能になります—1秒以内です。ほぼリアルタイム検索を定義するものは何でしょうか?

Elasticsearchが基づいているJavaライブラリであるLuceneは、セグメントごとの検索の概念を導入しました。セグメントは逆インデックスに似ていますが、Luceneにおけるインデックスは「セグメントのコレクションとコミットポイント」を意味します。コミット後、新しいセグメントがコミットポイントに追加され、バッファはクリアされます。

Elasticsearchとディスクの間にはファイルシステムキャッシュがあります。メモリ内インデックスバッファ内のドキュメント(図6)は新しいセグメントに書き込まれます(図7)。新しいセグメントは最初にファイルシステムキャッシュに書き込まれ(これは安価です)、その後ディスクにフラッシュされます(これは高価です)。ただし、ファイルがキャッシュにある場合、それは他のファイルと同様に開いて読み取ることができます。

メモリ内バッファに新しいドキュメントがあるLuceneインデックス

図6. メモリ内バッファに新しいドキュメントがあるLuceneインデックス

Luceneは新しいセグメントを作成して開くことを許可し、それに含まれるドキュメントをフルコミットを行うことなく検索可能にします。これはディスクへのコミットよりもはるかに軽いプロセスであり、パフォーマンスを低下させることなく頻繁に行うことができます。

バッファの内容がセグメントに書き込まれ、検索可能ですが、まだコミットされていません

図7. バッファの内容がセグメントに書き込まれ、検索可能ですが、まだコミットされていません

Elasticsearchでは、新しいセグメントを書き込んで開くこのプロセスをリフレッシュと呼びます。リフレッシュは、最後のリフレッシュ以降にインデックスで行われたすべての操作を検索可能にします。リフレッシュは以下の手段で制御できます:

  • リフレッシュ間隔を待つ
  • ?refreshオプションを設定する
  • Refresh APIを使用してリフレッシュを明示的に完了する(POST _refresh

デフォルトでは、Elasticsearchはインデックスを毎秒定期的にリフレッシュしますが、これは過去30秒間に1回以上の検索リクエストを受けたインデックスに対してのみ行われます。これが、Elasticsearchがほぼリアルタイム検索を持っている理由です:ドキュメントの変更はすぐには検索に表示されませんが、この時間枠内で表示されるようになります。