Обновление проиндексированного документа в Elasticsearch
Я пытаюсь понять, как вы обновляете проиндексированный документ в Elasticsearch. Я не понимаю, как это работает? Что ctx
что API имеет в виду делать? Допустим, у вас есть документ с вложенными документами, что вам нужно сделать, чтобы обновить его?
И в чем разница между удалением документа и последующим индексированием "обновленной" версии по сравнению с простым обновлением?
1 ответ
Запрос на обновление извлекает источник из asticsearch, изменяет его и индексирует его обратно в asticsearch. Если у вас уже есть копия документа с использованием обновления, не имеет особого смысла. Как правило, было бы быстрее просто индексировать новую версию. Однако, если у вас нет готового документа, но вы знаете, какие изменения вы хотите внести в документ, может быть более эффективно использовать обновление. Например, если у меня нет копии автомобильного документа, но я хочу добавить нового создателя, я могу сделать что-то вроде этого:
curl -XDELETE localhost:9200/test
curl -XPUT localhost:9200/test -d '{
"settings": {
"index.number_of_shards": 1,
"index.number_of_replicas": 0
},
"mappings": {
"car": {
"properties": {
"creators" : {
"type": "nested",
"properties": {
"name": {"type":"string"}
}
}
}
}
}
}
'
curl -XPOST localhost:9200/test/car/1 -d '{
"creators": [{
"name": "Steve"
}]
}
'
echo
curl -XPOST localhost:9200/test/car/1/_update -d '{
"script" : "ctx._source.creators += new_creator",
"params" : {
"new_creator" : {"name": "John"}
}
}'
echo
curl "localhost:9200/test/car/1?pretty=true"
echo
В скрипте обновления ctx
это специальная переменная, которая позволяет вам получить доступ к источнику объекта, который вы хотите обновить. ctx._source
является записываемой версией источника. Вы можете изменить этот документ в сценарии, и измененный источник будет сохранен как новая версия документа.
Вот как обновить документ вложенными документами клиентов в ElasticSearch 7.3:
POST /myindex/_doc/mypartid/_update
{
"script" : {
"source": "ctx._source.customers.add(params.newcust)",
"params" : {
"newcust" : {"customer": "cust3"}
}
}
}
Результаты в:
GET /myindex/_doc/mypartid
{
"_index": "myindex2",
"_type": "_doc",
"_id": "mypartid",
...
"_source": {
"part": "my part",
"customers": [
{"customer": "cust1"},
{"customer": "cust3"}
],
"machines": [
{"machine": "mach7"},
{"machine": "mach2"}
]
}
}
Итак, для ES7+ URL-адрес изменился, как и способ выполнения сценариев и операции, которые может выполнять массив (+=
не работает).