更新嵌套字段

时间:2016-10-13 16:14:02

标签: elasticsearch elasticsearch-java-api

您好我正在使用elasticsearch java API来更新脚本文档。但我得到的是异常

Exception in thread "main" MapperParsingException[object mapping for [content] tried to parse field [content] as object, but found a concrete value]
    at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:215)
    at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:308)
    at org.elasticsearch.index.mapper.DocumentParser.parseValue(DocumentParser.java:438)
    at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:264)
    at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:124)
    at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:309)
    at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:580)
    at org.elasticsearch.index.shard.IndexShard.prepareIndexOnPrimary(IndexShard.java:559)
    at org.elasticsearch.action.index.TransportIndexAction.prepareIndexOperationOnPrimary(TransportIndexAction.java:211)
    at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:223)
    at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:157)
    at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66)
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:657)
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:287)
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279)
    at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:77)
    at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

以下是ES

中的现有文件
{
  "_index": "index1",
  "_type": "type1",
  "_id": "1",
  "_version": 8,
  "found": true,
  "_source": {
    "content": {
      "contentId": 1,
      "metadata": {
        "title": "content one",
        "duration": 4500
      }
    },
    "custom": {
      "field1": "value1"
    }
  }
}

我想更新“内容”字段,如下所示

"content": {
      "contentId": 1,
      "metadata": {
        "duration": 900
      }
    }

当我使用REST调用(localhost:9200 / index1 / type1 / 1 / _update)进行更新时,它工作正常。我在java API prepareUpdate中遇到错误。

我有3个java类。 DTO类有Content对象 Content类具有Metadata对象和contentId 元数据类具有标题(String)和持续时间(long)。

以下是要更新的代码

Map<String, Object> params = new HashMap<>();
params.put("contentScript", dto.toString());
Script s = new Script("ctx._source.content=contentScript",ScriptType.INLINE,null,params);
UpdateResponse resp = client.prepareUpdate("index1", "type1", "1").setScript(s).setScriptedUpsert(true).get();

dto是DTO类的对象,并且相应地设置了值。

请帮忙。

1 个答案:

答案 0 :(得分:0)

params.put("contentScript", dto.toString());

您正在传递一个预期对象的字符串。以下代码可能有所帮助。

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

https://discuss.elastic.co/t/how-to-update-nested-objects-in-elasticsearch-2-2-script-via-java-api/43135/2