{
"_index" : "test",
"_type" : "test",
"_id" : "1212",
"_version" : 5,
"found" : true,
"_source" : {
"count" : 42,
"list_data" : [ {
"list_id" : 11,
"timestamp" : 1469125397
}, {
"list_id" : 122,
"timestamp" : 1469050965
} ]
}
}
Это моя схема документа. list_data
- вложенный объект. У меня есть требование обновить/удалить конкретную поданную внутри list_data
. Я могу обновить поле count
, используя отличный скрипт.Elasticsearch: удалить/обновить поле внутри вложенного объекта
$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
"script" : "ctx._source.count = 41"
}'
Но не знаю, как обновить вложенный объект.
Например, я хочу добавить это в list_data
.
{
"list_id" : 121,
"timestamp" : 1469050965
}
и мой документ должен измениться:
{
"_index" : "test",
"_type" : "test",
"_id" : "1212",
"_version" : 6,
"found" : true,
"_source" : {
"count" : 41,
"list_data" : [ {
"list_id" : 11,
"timestamp" : 1469125397
}, {
"list_id" : 121,
"timestamp" : 1469050965
}, {
"list_id" : 122,
"timestamp" : 1469050965
} ]
}
}
и если я выполнить удаление на основе list_id
= 122 моя запись должна выглядеть
{
"_index" : "test",
"_type" : "test",
"_id" : "1212",
"_version" : 7,
"found" : true,
"_source" : {
"count" : 41,
"list_data" : [ {
"list_id" : 11,
"timestamp" : 1469125397
}, {
"list_id" : 121,
"timestamp" : 1469050965
}]
}
}
Большое спасибо @Val. Поддерживается ли это через клиент Elastic java? Если вы можете предоставить код клиента Java для тех же операций, что будет отлично. –
Рад, что это помогло! В официальной документации Java Client есть пример: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html#java-docs-update-api -script – Val
Метод добавления продолжает добавлять значения, даже если он уже присутствует. Я хочу проверить, присутствует ли 'list_id', а затем обновить значение timestamp, иначе добавить его. Если вы можете предоставить некоторую ссылку для изучения этой части скрипта, это будет полезно для меня в будущем. –