2015-10-15 2 views
2

У меня есть следующий документкак обновить вложенный документ внутри массива в elasticsearch

{ 
    "uuid": "123", 
    "FirstName": "personFirstNmae", 
    "LastName": "personLastName", 
    "Inbox": { 
    "uuid": "121", 
    "messageList": [ 
     { 
     "uuid": "321", 
     "Subject": "subject1", 
     "Delete": { 
      "deleteStatus": 0, 
      "deleteReason": 0 
     } 
     }, 
     { 
     "uuid": "123", 
     "Subject": "subject", 
     "Delete": { 
      "deleteStatus": 0, 
      "deleteReason": 0 
     } 
     } 
    ] 
    } 
} 

и здесь отображение

{ 
    "arteciatedb" : { 
    "mappings" : { 
     "directUser" : { 
     "properties" : { 
      "FirstName" : { 
      "type" : "string", 
      "store" : true 
      }, 
      "Inbox" : { 
      "type" : "nested", 
      "include_in_parent" : true, 
      "properties" : { 
       "messageList" : { 
       "type" : "nested", 
       "include_in_parent" : true, 
       "properties" : { 
        "Delete" : { 
        "type" : "nested", 
        "include_in_parent" : true, 
        "properties" : { 
         "deleteReason" : { 
         "type" : "integer", 
         "store" : true 
         }, 
         "deleteStatus" : { 
         "type" : "integer", 
         "store" : true 
         } 
        } 
        }, 
        "Subject" : { 
        "type" : "string", 
        "store" : true 
        }, 
        "uuid" : { 
        "type" : "string", 
        "store" : true 
        } 
       } 
       }, 
       "uuid" : { 
       "type" : "string", 
       "store" : true 
       } 
      } 
      }, 
      "Inbox.uuid" : { 
      "type" : "string" 
      }, 
      "LastName" : { 
      "type" : "string", 
      "store" : true 
      }, 

      "uuid" : { 
      "type" : "string", 
      "store" : true 
      } 
     } 
     } 
    } 
    } 
} 

Теперь я хочу, чтобы обновить значение deleteStatus от 0 до 1 этого поле внутри массива вложенный документ полный пробег в этом поле:

Inbox.messageList.Delete.deleteStatus 

Я пытаюсь чтобы сделать это, как этот

 var params:java.util.Map[String,Object] = Maps.newHashMap(); 
    params.put("updateMap","1") 

val response = client.prepareUpdate("testdb", "directUser", directUserObj.getUuid) 
    .setScript("ctx._source.Inbox.messageList.Delete.deleteStatus = updateMap",ScriptService.ScriptType.INLINE) 
    .setScriptParams(params) 
    .execute().actionGet(); 

, но он дает следующую ошибку

org.elasticsearch.ElasticsearchIllegalArgumentException: failed to execute script 
    at org.elasticsearch.action.update.UpdateHelper.prepare(UpdateHelper.java:202) 
    at org.elasticsearch.action.update.TransportUpdateAction.shardOperation(TransportUpdateAction.java:176) 
    at org.elasticsearch.action.update.TransportUpdateAction.shardOperation(TransportUpdateAction.java:170) 
    at org.elasticsearch.action.support.single.instance.TransportInstanceSingleOperationAction$AsyncSingleAction$1.run(TransportInstanceSingleOperationAction.java:187) 
    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) 
Caused by: org.elasticsearch.script.groovy.GroovyScriptExecutionException: IllegalArgumentException[argument type mismatch] 
    at org.elasticsearch.script.groovy.GroovyScriptEngineService$GroovyScript.run(GroovyScriptEngineService.java:278) 
    at org.elasticsearch.action.update.UpdateHelper.prepare(UpdateHelper.java:198) 
    ... 6 more 

я уже добавили эту линию

script.engine.groovy.inline.update: on 

в elasticsearch YML файл также, когда я пытаюсь это сделать например

params.put("updateMap","12345") 




    val response = client.prepareUpdate("testdb", "directUser", directUserObj.getUuid) 
    .setScript("ctx._source.Inbox.uuid = updateMap",ScriptService.ScriptType.INLINE) 
    .setScriptParams(params) 
    .execute().actionGet(); 

то значение обновляется без каких-либо ошибок, а затем мой документ становится

{ 
    "uuid": "123", 
    "FirstName": "personFirstNmae", 
    "LastName": "personLastName", 
    "Inbox": { 
    "uuid": "12345", 
    "messageList": [ 
     { 
     "uuid": "321", 
     "Subject": "subject1", 
     "Delete": { 
      "deleteStatus": 0, 
      "deleteReason": 0 
     } 
     }, 
     { 
     "uuid": "123", 
     "Subject": "subject", 
     "Delete": { 
      "deleteStatus": 0, 
      "deleteReason": 0 
     } 
     } 
    ] 
    } 
} 

, пожалуйста, руководство меня, как я могу обновить deleteStatus поля значения от 0 до 1, и что я делаю неправильно

+0

Как выглядит сопоставление? – eemp

ответ

0

Ваш сценарий должен быть разные:

for(i in ctx._source.Inbox.messageList){i.Delete.deleteStatus=1} 

И в вашем коде, вероятно, так:

.setScript("for(i in ctx._source.Inbox.messageList){i.Delete.deleteStatus=updateMap}",ScriptService.ScriptType.INLINE) 
+0

большое вам спасибо – swaheed