2016-07-28 9 views
0

Этот код работает должным образом. Но вместо добавления третьей страны в качестве другого документа, я хочу обновить первый документ.обновить документ elasticsearch

DELETE /test_index 

PUT /test_index 

PUT /test_index/doc/1 
{ 
    "parent": [ 
     { 
     "name": "India", 
     "label": "IN" 
     }, 
     { 
     "name": "China", 
     "label": "CN" 
     } 
    ] 
} 

PUT /test_index/doc/2 
{ 
    "parent": [ 
     { 
     "name": "Pakistan", 
     "label": "PK" 
     } 
    ] 
} 

Для того чтобы идентификатор документа 1 имел 3 страны Индия, Китай и Пакистан. Я думаю, мне нужен API обновления с параметром doc_as_upsert. Но я не уверен, как написать JSON.

+0

см: https://www.elastic.co/guide/en/elasticsearch/ reference/current/docs-update.html # _updates_with_a_partial_document – ymonad

+0

этот документ может быть лучше: https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-updates.html#_using_scripts_to_make_partial_updates – ymonad

ответ

1

Вы можете сделать скриптовых обновляется с помощью update API:

curl -XPOST 'localhost:9200/test_index/doc/1/_update' -d '{ 
    "script" : { 
     "inline": "ctx._source.parent += ['name': name, 'label': label]", 
     "params" : { 
      "name" : "Pakistan", 
      "label": "PK" 
     } 
    } 
}' 

UPDATE

Если вы хотите использовать это в объемном запросе, также возможно

curl -XPOST 'localhost:9200/test_index/doc/_bulk' -d ' 
{ "update" : { "_id" : "1"} } 
{ "script" : { "inline": "ctx._source.parent += ['name': name, 'label': label]", "lang" : "groovy", "params" : {"name" : "Pakistan", "label": "PK"}}} 
' 
+0

Возможно ли, чтобы использовать это навалом API? Потому что мой индекс имеет миллионы записей, и несколько тысяч из них необходимо обновить так! – shantanuo

+0

Да, я обновил свой ответ – Val

+0

Я получаю «исключение документа без исключения», если идентификатор 1 не существует. Возможно ли создать документ 1 с этим запросом на обновление? – shantanuo

0

Добавляя к ответу val, я могу использовать upsert, если документ еще не существует.

POST /test_index/doc/1/_update 
{ 
    "script": { 
     "inline": "ctx._source.parent += ['name': name, 'label': label]", 
     "params": { 
     "name": "Pakistan", 
     "label": "PK" 
     } 
    }, 
    "upsert": {"parent" : [{ 
     "name": "Pakistan", 
     "label": "PK" 
    }] 
    } 
} 

UPDATE

Bulk API с помощью upsert будет выглядеть примерно так ...

POST /test_index/doc/_bulk 
{ "update" : { "_id" : "1"} } 
{ "script" : { "inline": "ctx._source.parent += ['name': name, 'label': label]", "lang" : "groovy", "params" : {"name" : "Pakistan", "label": "PK"}}, "upsert": {"parent" : [{"name": "Pakistan", "label": "PK" }] }}