2017-10-10 10 views
1

条件に一致する文書を一括更新したいと思います。
ESバージョン:5.1.1
インデックス:index_1234
タイプ:アドレス
URL:POST http://localhost:9200/index_1234/addresses/_update_by_query
ペイロード:特定の条件に一致するElasticSearch文書を更新してください

{ 
    "id":1, 
    "address":"temp address" 
} 

私は書類に

{ 
    "script": { 
    "inline": "if(ctx._source.containsKey(\"address\") && ctx._source.address == "temp address"){ctx._source.address='perm address'}" 
    } 
} 
を更新するには、次のインラインスクリプトを使用しています

ie "address"フィールドの値が "temp address"の場合、 "perm address"と置き換えます

このスクリプトは完全に動作し、一致するドキュメントのみを更新します。私は疑問を持っているしかし

その5「一時アドレス」として「アドレス」フィールドがあり、5は上記のスクリプトを実行するには、「パーマアドレス」

として「アドレス」フィールドを持っているから、合計10個の文書が存在すると仮定それが唯一の5文書を更新もののので、O/P

{ 
    "took": 131, 
    "timed_out": false, 
    "total": 10, 
    **"updated": 10**, 
    "deleted": 0, 
    "batches": 1, 
    "version_conflicts": 0, 
    "noops": 0, 
    "retries": { 
     "bulk": 0, 
     "search": 0 
    }, 
    "throttled_millis": 0, 
    "requests_per_second": -1, 
    "throttled_until_millis": 0, 
    "failures": [] 
} 

を以下与えます(私はダブルチェックして)、最終的な応答では、「更新」と言う:10.私は「更新」期待していた:5、私が行方不明です何か ? 他のものを更新していますか?つまり、一致する文字列を持たないドキュメントの場合でも、すべてのドキュメントについて「_バージョン」が更新されていることがわかります。
ありがとうございます!

UPDATE:次のように更新クエリでのマイク・フィールドのチェックによると迅速な対応のための

おかげでたくさんのMike :)
を更新する必要があります。

"query": { 
    "exists": { 
    "field": "address" 
    } 
} 

しかし、もう1つ問題があります。
最初は質問の簡素化のためにフィールドを最小限に保っていました。 実際には、ペイロードには多くのフィールドがあり、いくつかの条件に基づいて3つを更新したいと考えています。

ので、

{ 
    "id":12, 
    "address":"temp address", 
    "email":"temp email", 
    "phone":"temp phone", 
    . 
    . 
    . 
} 

を次のようにペイロードはであり、我々は複数のフィールドのためのマイクのソリューションを更新することができ、私はすべての3つのフィールド

{ 
    "script": { 
    "inline": "if(ctx._source.containsKey(\"address\") && ctx._source.address == "temp address"){ctx._source.address='perm address'}if(ctx._source.containsKey(\"email\") && ctx._source.email == "temp email"){ctx._source.email='perm email'}if(ctx._source.containsKey(\"phone\") && ctx._source.phone == "temp phone"){ctx._source.phone='perm phone'}" 
    } 
} 

を更新するには、次のスクリプトを使用しています?またはこれを行うための別の方法がありますか? もう一度おねがいします!

答えて

2

これは、_update_by_queryリクエストで取得するすべてのドキュメントを実際に変更していなくても、少なくともクエリのヒット数としてカウントされるためです。

代わりの更新クエリであなたのフィールドチェックをやって、これはあなたの更新要求にクエリを存在して追加します。

"query": { 
    "exists": { 
    "field": "address" 
    } 
} 

編集が更新され、質問に対応する:あなたは3つのフィールドを更新する場合は、 あなたを」 1つのスクリプトで3つの同時修正を行うのが最も簡単な時間になるでしょう。上に示したように、カウントは実際に文書に対して行われた変更を反映していません。カウントが絶対に必要な場合は、これを行うことができます(これらのいずれかのドキュメントにフィルタリングします)。

"query": { 
    "bool": { 
    "minimum_should_match": 1, 
    "should": [ 
     { 
     "term": { 
      "address": { 
      "value": "temp address" 
      } 
     } 
     }, 
     { 
     "term": { 
      "email": { 
      "value": "temp email" 
      } 
     } 
     }, 
     { 
     "term": { 
     "phone": { 
      "value": "temp phone" 
     } 
     } 
    } 
    ] 
    } 
    } 
+0

こんにちはマイク、非常に迅速な応答ありがとう:)私は質問を更新しました今、「更新」セクションを見てください。 ?? – SSG

+0

更新された質問に返信を追加しました@SSG – Miek

+0

ありがとうございました!しかし、3つの条件がすべて一致した場合にのみ、インラインスクリプトが実行されると考えられます.3つの条件のうち1つまたは2つ、または3つすべてが一致するケースがあります。 – SSG

関連する問題