2016-08-18 49 views
0

我有一個文檔:更改多個文檔字段不起作用在ES 2.3.3

"_index": "boe_bpm", 
"_type": "document", 
"_id": "3215951", 
"_version": 1, 
"_source": { 
    "title": "aaaa", 
    "process": { 
     "tasks": [{ 
       "class": "value1", 
       "id": 1 
      }, { 
       "class": "value1", 
       "id": 2 
      }, 

      ... { 
       "class": "value1", 
       "id": 1000 
      } 

     ] 
    } 
} 

我想改變的process/tasks價值,但失敗了,我的代碼:

List ll = new ArrayList(); 
     for (int i = 0; i < 1000; i++) { 
      ll.add(i); 
     } 

    params.put("ids", ll); 
    params.put("classParam", "xxxxzzzaaa"); 
    client.prepareUpdate("boe_bpm", "document", "3215951").setScript(new Script(
         "def items = ctx._source.items.findAll{ it.id in ids}; if (items) { for(int i=0; i<items.size(); i++) { items[i]['class']=classParam; } }", 
         ScriptType.INLINE, null, params)) 
       .get(); 

有沒有錯誤或異常信息。

爲什麼它不工作?如何改變我的代碼?

+2

你得到一個錯誤,或者什麼都沒有更新? – Val

+0

沒有錯誤或異常信息返回,什麼都沒有updated.I不知道爲什麼。 –

+0

根據上述示例文檔,'ctx._source.items'應該是'ctx._source.process.tasks',對不對? – Val

回答

1

根據上述示例文檔,ctx._source.itemsctx._source.process.tasks,對不對?

你,如果你利用Groovy中發揮到極致這樣的腳本可以簡單得多:

ctx._source.process.tasks.findAll { it.id < 1000 }.each { it['class'] = classParam } 

所以,你的更新代碼將改爲:

Map<String, Object> params = new HashMap<>(); 
params.put("classParam", "xxxxzzzaaa"); 
String script = "ctx._source.process.tasks.findAll { it.id < 1000 }.each { it['class'] = classParam }"; 
client.prepareUpdate("boe_bpm", "document", "3215951") 
    .setScript(new Script(script, ScriptType.INLINE, null, params)) 
      .get();