2017-04-03 38 views
0

私は最新のドキュメントスナップショットを提供するデータソースを持っています(差分ではありません)。同じスナップショットにelasticsearchを反映させて検索したいと思います。私は同じことを行うには、次のオプションがあります。ElasticSearchの一括更新データ:一括更新/削除とエイリアスを使用したゼロからのインデックス付け

  1. は同じ(スクロールを使用して)弾性からすべてを取得し、メモリや一括更新(indexアクションで一括API)で差分を計算する - これが二回保持するためのプログラムが必要になります更新を計算するためにメモリを増やす
  2. スナップショットからすべてのものをスナップショットから一括して更新し、更新されなかったものすべてをエラスティック(UIDのフィルタを検索して最後に更新)からフェッチし、別のバルク要求をソフトにする私たちが弾性から多くのデータをダウンロードする必要はないので、diff(バルクAPIの更新アクション)を削除してください。
  3. エイリアスで2つのインデックスを保持し、 1つは現在の「検索可能な」コピーとして、もう1つは更新のためのスタンバイとして使用されます。新しいスナップショットが登場するたびに、待機中のものを[delete all documents][1]に使用し、スナップショットのすべてをスタンバイのものに一括更新し、エイリアス(本質的に別名API - アトミック)を最新のものにフリップすることができますが検索されます。

注:diffは非常に小さいと考えられます。

アプローチ2は、パフォーマンスコストと弾性効率の面でアプローチ3とどのように似ていますか?

+0

私たちはどのように多くのレコード/文書を話しています約? – Val

+0

約30kのレコードですが、データを100kに拡大すると、パフォーマンスがどのように影響を受けるかを理解したいと思います。 – Tweety

答えて

0

オプション1は、メモリ要件とコンピューティングニーズの両方において、最もパフォーマンスの低いものです。 1)あなたのプライマリデータソースからのすべてのレコードを照会する、2)Elasticsearchからすべてのレコードを照会する、3)差分を計算する、4)Elasticsearchですべてのレコードを一括更新する必要があります。時間が経過すると、主データソースには常にほぼ同数のレコードが含まれますが、スナップショットにElasticsearchにない新しいレコードと削除する必要のあるレコードがあるため、ESのレコード数が増加しますElasticsearch。これは、上記のステップ2が毎回ますます多くの文書を検索することを意味します。

オプション2では、1)主データソースのすべてのレコードを照会する、2)バルクインデックスする、3)更新されなかったレコードをElasticsearchにクエリする、4)Elasticsearchで一括更新する再び。これは、オプション1と同じ理由で、私の好みではない、つまり、あなたのElasticsearchインデックスは成長を続けます。

オプション3は、私の意見では理想的なソリューションに最も近いものです。私がお勧めするのは、スナップショットのインデックスを作成する必要があるたびに、新しいインデックスを作成し、スナップショットデータを一括して索引付けし、完了したらsearchableエイリアスを新しいインデックスに置き換えることです。古いインデックスはもはや使用しないので削除することもできます。差分、一括削除、または一括更新を行う必要はありません。

  • 1日目:
    • index1に(別名:searchable
  • 2日目:
    • index1に(削除可能)
    • インデックス2(別名:searchable
  • 3日目:
    • index1に(削除することができます)
    • インデックス2(削除することができます)
    • Index3(別名:searchable
+0

エントリを上書きするためのuidを指定できるので、データの増加は起こりません。 – Tweety

+0

しかし、私が説明したオプションは最高のパフォーマンスを提供するはずです。 – Val

+0

リフレッシュが発生するたびに新しいインデックスを作成するという欠点はありませんか? – Tweety