2016-08-03 4 views
2
{ 
    "_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 
    }] 
    } 
} 

ответ

5

Чтобы добавить новый элемент к вашему вложенное поле можно продолжить следующим образом:

$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d ' 
{ 
    "script" : "ctx._source.list_data += newElement", 
    "params": { 
     "newElement": { 
      "list_id" : 121, 
      "timestamp" : 1469050965 
     } 
    } 
}' 

Чтобы удалить существующий элемент из вашего вложенного списка полей, вы можете продолжить так:

$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d ' 
{ 
    "script" : "ctx._source.list_data.removeAll{it.list_id == remove_id}", 
    "params": { 
     "remove_id" : 122 
    } 
}' 
+1

Большое спасибо @Val. Поддерживается ли это через клиент Elastic java? Если вы можете предоставить код клиента Java для тех же операций, что будет отлично. –

+1

Рад, что это помогло! В официальной документации Java Client есть пример: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html#java-docs-update-api -script – Val

+0

Метод добавления продолжает добавлять значения, даже если он уже присутствует. Я хочу проверить, присутствует ли 'list_id', а затем обновить значение timestamp, иначе добавить его. Если вы можете предоставить некоторую ссылку для изучения этой части скрипта, это будет полезно для меня в будущем. –

Смежные вопросы