2016-04-27 59 views
0

捲曲-XPOST '本地主機:9200 /測試/ TYPE1/1/_Update' -D「{ 「腳本」: 「ctx._source.name_of_new_field = \」 value_of_new_field \ 「」 }'Elasticsearch與JSON作爲值的Java API更新API

這是來自elasticsearch參考站點的一個示例,它用新字段更新現有文檔。 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html

我想更新現有的文件與「新領域」,但與json作爲「新領域的價值」而不是單一字符串作爲「新領域的價值」。就像下面一樣。

捲曲-XPOST '本地主機:9200 /測試/ TYPE1/1/_Update' -D「{ 「腳本」: 「ctx._source.test = {\」 newTest \ 「:\」 你好\」 }「 }'

它返回下面的錯誤。

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "remote_transport_exception", 
     "reason": "[Ravage 2099][127.0.0.1:9300][indices:data/write/update[s]]" 
     } 
    ], 
    "type": "illegal_argument_exception", 
    "reason": "failed to execute script", 
    "caused_by": { 
     "type": "script_exception", 
     "reason": "Failed to compile inline script [ctx._source.test2 = {\"test2\":\"hihi\"}] using lang [groovy]", 
     "caused_by": { 
     "type": "script_exception", 
     "reason": "failed to compile groovy script", 
     "caused_by": { 
      "type": "multiple_compilation_errors_exception", 
      "reason": "startup failed:\n4e487d5bc8afde27adf29b77e8427f5da1534843: 1: expecting '}', found ':' @ line 1, column 29.\n ctx._source.test2 = {\"test2\":\"hihi\"}\n        ^\n\n1 error\n" 
     } 
     } 
    } 
    }, 
    "status": 400 
} 

是否有可能用「json值」更新現有文檔?或者每個更新請求都應該有單個字符串值?

回答

0

您可以嘗試Updates with a partial documenthttps://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#_updates_with_a_partial_document

像:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
"doc" : { 
    "test" : { 
     "newTest" : "hello" 
     } 
    } 
}' 
+0

我仍然得到以下.. { 「錯誤」:{ 「ROOT_CAUSE」:[{ 「類型」: 「mapper_parsing_exception」, 「理由」: 「無法解析[測試]」 } ], 「類型」: 「mapper_parsing_exception」, 「原因」: 「無法解析[測試]」, 「caused_by」:{ 「類型」: 「illegal_argument_exception」, 「原因」:「未知屬性[ newTest]「 } }, 」status「:400 } –

0

如果你想添加一個JSON對象,只需使用常規的哈希,這樣

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "ctx._source.test = ['newTest':'hello']" 
}' 

你的對象將看起來像這樣之後

{ 
    "test": { 
     "newTest": "hello" 
    } 
} 
+0

你把['newTest':'hello']稱爲groovy hash嗎?這與json有何不同? –

+0

這是相同的,並將索引時轉換爲JSON。概念上的散列相當於JSON散列。 – Val