2017-10-18 16 views
0

したがって、私たちはあるインデックスから別のインデックスへElasticsearchドキュメントを再インデックスする必要がある状況にあります。私たちは再インデックスAPIを使用しています。ドキュメントが宛先インデックスに既に存在することもありますが。 version_type: "external"を設定すると、完全な更新を実行する点を除いて、目的の索引の文書が更新され、その文書を部分的に更新したいと考えています。 ctx.op = "partial"のような設定はいいですが、今日の時点では実装されていないようです。 これを達成するための代替案があれば幸いです。Elasticsearch reindex APIの部分的な更新

PS:すべてのドキュメントのソースインデックスを照会してupsertで個別に送信するのは避けたいのですが、パフォーマンスの理由から、再インデックスAPIに比べてかなり遅いと思われます。

答えて

0

免責事項:この回答が更新されました。

部分的な更新を実現するには、scriptを定義することができます。

理論的には、再インデックス化されるドキュメントに任意の変換を適用することができます。

(オリジナルの答えの終わり。)質問の著者が指摘したように1が2をマージする必要がある場合、それは助けないカスタムREINDEX-とマージ

を実装


結果の索引にすでに存在するものと新しいものが含まれます。

弾性抽出_reindexの方法がversion 2.3に導入され、実験的であると考えられた。単にscrollというクエリとbulk insert APIの組み合わせのように見えます。効率的に古いインデックスからすべてのドキュメントのインデックスを再作成するには

、昔からの文書のバッチを取得するために、スクロールを使用します。私はDefinitive Guideの中this pageは、このようにあなたのデータのインデックスを再作成することを提案するという事実に基づいてこの結論を作りますインデックス、およびバルクAPIを使用して、それらを新しいインデックスにプッシュします。

ここで、部分更新の必要性に対処する。

  1. 併合ドキュメント
  2. インデックスBからインデックスから
  3. 読取原稿を原稿を読み取るBに新しい文書を挿入:REINDEX-とマージのプロセスは、大きく4つの段階に分けることができます

ステージ1と4は実際にはreindexコールの元のシナリオです。それを今異なるものにするのは、別のインデックスに参加してドキュメントをマージする必要があるからです。

カスタムスクリプトを書いて、インデックスAをストリーミング形式で読み込むためにscroll、インデックスBから文書を取り出すための一括API、文書をマージするカスタムコード、文書を挿入するバルクAPIを使用することを提案します。このようなスクリプトのパフォーマンスは、元のreindexの実装と少なくとも同等です。 (また、あなたは/特定の増加で、index performance tuning tipsで、このページをチェックしてくださいindex.refresh_intervalを無効にすることを確認してください。)もちろんElasticSearchに関連していないと、この質問の著者は、すでに(と考えているかもしれない他のオプション、あります

両方のインデックスをダンプする、カスタムコードで結合する、新しいインデックスを挿入するなど)。

これが役に立ちます。

+0

はい、私が間違っていない限り、その変換はソースインデックスから来るデータに適用され、宛先ドキュメント自体には適用されません。 – SebScoFr

+0

@SebScoFrはい、そうです。私はそれが関係ないので私の答えを削除します。 –

関連する問題