2016-10-13 5 views
-1

こんにちは私は、スクリプトでドキュメントを更新するために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) 

ある既存のドキュメント例外の下に取得しています、私は私がするとき

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

以下のように「コンテンツ」フィールドを更新したいと思いES

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

REST呼び出し(localhost:9200/index1/type1/1/_update)で更新しても問題ありません。 Java APIのprepareUpdateでエラーが発生します。

私は3つのJavaクラスを持っています。 DTOクラスにはContentオブジェクトがあります コンテンツクラスにはメタデータオブジェクトとcontentIdがあります。 メタデータクラスにtitle(String)とduration(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クラスのオブジェクトであり、値が適宜設定さを更新するためのコードです。

助けてください。

答えて

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

+0

これが働いていました。しかし、私はparamsマップにdtoオブジェクトまたはjson文字列を置いていますが、同じエラーが発生しています。 HashMapオブジェクトだけが正常に動作しています。 – Raguram

関連する問題