Как обновить вложенный документ внутри массива в asticsearch
У меня есть следующий документ
{
"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
в файле Yelasticsearch также, когда я пытаюсь сделать это так
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 и что я делаю не так
1 ответ
Решение
Ваш скрипт должен быть другим:
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)