2016-03-01 29 views
1

我試圖通過Java API使用類似於here概述的技術來更新Elasticsearch中的嵌套對象。問題是如何將json傳遞到腳本中。如果我只是盲目地將json連接到腳本字符串,建議here,Groovy不會編譯。如果直接將它作爲參數傳遞,它只會被解析爲一個字符串。如果我嘗試使用JsonSlurper,如:如何通過Java API更新Elasticsearch 2.2腳本中的嵌套對象

String script = "ctx._source.pete = new groovy.json.JsonSlurper().parseText(json)"; 
Map<String, Object> params = ImmutableMap.of("json", json); 
return new Script(script, ScriptService.ScriptType.INLINE, null, params); 

我得到一個編譯例外:無法解析類groovy.json.JsonSlurper

與JsonSlurper方法的另一個問題似乎是,在Elasticsearch團隊它基本上是disabled它在2.2中。

有誰知道如何通過Java API正確傳遞json嗎?

+0

,你可以嘗試添加'進口groovy.json.JsonSlurper;'在腳本的開始?只是爲了看看編譯錯誤是否出來? – Val

+0

@VAL不幸的是,這並沒有幫助,同樣的錯誤。 – PeteyPabPro

+0

值得一試,儘管這很明顯,爲什麼這個被禁用,爲什麼ES的人堅持這個決定。 – Val

回答

1

感謝Elasticsearch的幫助我。答案是到JSON轉換爲Map,然後就通過Map作爲PARAM:

String script = "ctx._source.pete = jsonMap"; 
Map<? ,?> jsonMap = new ObjectMapper().readValue(json, HashMap.class); 
Map<String, Object> params = ImmutableMap.of("jsonMap", jsonMap); 
return new Script(script, ScriptService.ScriptType.INLINE, null, params); 

我使用org.codehaus.jackson.map.ObjectMapper做從JSON到Map轉換。

-1

我已經在StackOverflow in this thread上寫了關於該主題的廣泛答案。我使用Java中的UpdateRequest類,而不是腳本,您必須提供包含所有您希望執行的更改的XContentBuilder對象。

這是答案的一個片段:

UpdateRequest updateRequest = new UpdateRequest(); 
//.... 
XContentBuilder jb = XContentFactory.jsonBuilder(); 
jb.startObject(); 
jb.startArray(".."); 

for (/**/) { 
    jb.startObject() 
    .field("attrX", value) 
    // .. 
    .startObject("attrY") 
    .field("attrZ", value) 
    .endObject() 
    .field("atrrW", value) 
    .endObject(); 
} 
jb.endArray(); 
b.endObject(); 
updateRequest.doc(jb); 
相關問題