2016-08-26 4 views
0

これは面白いスクリプトです。問題はctx._source.academies.remove(index)です。なぜならctxはそこに表示されないからです。インデックス変数は正しいです...しかし、私はそこにctxを使用することはできません。助言がありますか?Elasticsearch Groovy Script eachWithIndex

{ 
    "script" : "ctx._source.academies.eachWithIndex { it, index -> if(it['academy_id'] == academy_id) ctx._source.academies.remove(index) }", 
    "params": { 
     "academy_id": 344 
    } 
} 

答えて

1

あなたはこれを試したことがあり、最後の見つかったオブジェクトのために働きますか?あなたは以下の項目のリストを照合​​をチェックする必要がある場合には

ctx._source.academies.removeAll { it['academy_id'] == academy_id } 

を使用することができます(閉鎖が基準を満足しなければならない)

ctx._source.academies.removeAll { it['academy_id'] in [academy_id, some_other_id] } 

弾性検索の観点からすると、私は考えスクリプトは以下のように書き換えられます:

{ 
    "script" : "ctx._source.academies.removeAll { it['academy_id'] in academy_ids }", 
    "params": { 
     "academy_ids": [344, 345, 346] 
    } 
} 
+0

あなたは完璧です!!!!!!ありがとうございました....どのようにacademy_id配列を作ることができますか?アレイとしてアカデミーをparamsに渡すことはできますか?だから、一度に複数のIDを持つ複数のアカデミーを削除することができます – Michalis

+0

もちろんあります。あなたが必要とするのは、クロージャから返されるブール値だけです。更新された回答を参照してください。 – dmahapatro

0

これが最適なソリューションですか?

def findIndex; ctx._source.academies.eachWithIndex { it, index -> if(it['academy_id'] == academy_id) findIndex = index }; ctx._source.academies.remove(findIndex) 

が、これは唯一の

関連する問題