50万件の索引を全部作り直すと4.2分でした。差分だけ入れるなら5000件で0.2分です。
ところが更新が10万件を超えると差分のほうが遅くなります。全体の20%が分かれ目でした。
差分投入は更新件数に比例します。作り直しは件数によらず一定なので、どこかで入れ替わります。
同期パイプラインでまず決めるのが、差分だけ入れるか、全部作り直すかです。実際に計算して、分かれ目を出しました。
索引の総件数を50万件としました。作り直しは毎秒2000件、差分の投入は毎秒400件です。
差分のほうが1件あたり遅いのは、既にあるかどうかを確かめてから書き換えるためです。
索引の総件数 500000件。全部作り直すと 4.2分かかる 作り直しは毎秒 2000件、差分の投入は毎秒 400件として計算した 1日の更新件数 全体に対する割合 全部作り直す 差分だけ入れる 速いのは 500件 0.1% 4.2分 0.0分 差分 5000件 1.0% 4.2分 0.2分 差分 50000件 10.0% 4.2分 2.1分 差分 100000件 20.0% 4.2分 4.2分 作り直し 200000件 40.0% 4.2分 8.3分 作り直し 入れ替わる点は 100000件。全体の 20.0% を超えると作り直したほうが速い。
1日の更新が5000件なら、差分は0.2分です。作り直しの4.2分と比べて20分の1で済みます。
20万件になると差分は8.3分で、作り直しの倍かかります。1件あたりが遅いぶんが効いてきます。
計算は簡単です。作り直しの所要(秒)に、差分投入の毎秒件数を掛けるだけです。
この計測なら250秒×400件で10万件になります。総件数の20.0%です。
出典も反映の単位を更新は、前回の更新以降に索引へ行われたすべての操作を検索できるようにすると説明しています。まとめて反映する形は同じです。
差分は件数に比例し、作り直しは一定。どこかで入れ替わる。
A refresh makes all operations performed on an index since the last refresh available for search.原文Elastic「Near real-time search」 この内容の有効期限2027-02-18
未反映の件数は少なくても、更新された文書ほど引かれやすいので結果に出ます。
同期パイプラインの遅れは、件数で見ると小さく見えます。検索結果で見ると印象が変わります。
総件数50万件、1日の更新5000件で計算しました。更新された文書はそうでない文書より6倍引かれやすいものとしています。
反映の間隔 未反映の件数 上位10件に古い内容が混ざる問いの割合 5分 17件 0.25% 60分 208件 2.38% 360分 1250件 13.88% 1440分 5000件 44.92%
6時間ごとの反映なら、未反映は1250件です。総件数50万件の0.25%にすぎません。
ところが上位10件に古い内容が混ざる問いは13.88%です。件数の割合の50倍以上あります。
理由は2つあります。1つは更新された文書ほど引かれやすいこと。話題が新しいほど問いに当たります。
もう1つは上位10件を見ていることです。1件あたりの確率が小さくても、10回引けばどれかが当たります。
1日1回の反映では44.92%まで上がります。2回に1回近く、古い内容が混ざる状態です。
出典もこの性質をだからこそ近実時間の検索と呼ぶ。文書の変更は検索へ即座には見えないが、この時間内には見えるようになると説明しています。
未反映の件数は小さくても、結果には大きく出る。
This is why we say that Elasticsearch has near real-time search: document changes are not visible to search immediately, but will become visible within this timeframe.原文Elastic「Near real-time search」 この内容の有効期限2027-02-18
更新だけを見ていると、削除と移動が残ります。作り直しなら消えるものが、差分では残ります。
同期パイプラインを差分で回すなら、何を変更として拾うかを決めます。拾い漏れは索引に残り続けます。
3番目を落とすと、消したはずの文書が検索に出続けます。作り直しなら自然に消えるので、差分に切り替えたときに露見します。
4番目も同じです。見せてよい相手が変わったのに索引が古いままだと、権限のない人に出ます。
2番目を使うと、形だけ触られた文書を弾けます。埋め込みの作り直しは重いので、ここで減らせると効きます。取り込みの前段はドキュメントローダの記事で扱っています。
反映を細かくすると、そのぶん処理が走ります。出典は既定の動きを既定では1秒ごとに索引を更新するが、直近30秒に1件以上の検索要求を受けた索引に限ると説明しています。
使われていない索引は更新しない、という考え方です。更新の頻度は、検索の頻度に合わせます。
削除を拾わないと、差分に切り替えた瞬間に残り始める。
毎秒2000件・毎秒400件という速さは置いた値です。実際の速さは埋め込みの計算を含むかどうかで桁が変わります。更新された文書が6倍引かれやすいという置き方も、業務によって大きく違います。ここで見せているのは、差分と作り直しに分かれ目があることと、未反映の件数より結果への出方のほうが大きいという関係です。
By default, Elasticsearch periodically refreshes indices every second, but only on indices that have received one search request or more in the last 30 seconds.原文Elastic「Near real-time search」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る