В общем, вы можете обновить несколько документов с Elasticsearch-х Bulk API (ссылаюсь на 1,7. Версии доку).
Здесь вы можете увидеть разницу между нормальным update (через команду curl) и массовым обновлением.
Обычное обновление:
curl -XPOST 'localhost:9200/index1/type1/id1/_update' -d '{
"name" : "updated John"
}
Массовое обновление:
POST /_bulk
{ "update": { "_index": "index1", "_type": "type1", "_id": "id1", "_retry_on_conflict" : 3} }
{ "doc" : {"name" : "updated John"} }
{ "update": { "_index": "index1", "_type": "type1", "_id": "id1", "_retry_on_conflict" : 3} }
{ "doc" : {"name" : "The second update for John"} }
КСТАТИ: Объемные запросы предпочтительнее, если у вас есть операции на многих документах. вот docu, описывая его подробно.
EDIT: Чтобы обновить некоторые документы, которые соответствуют запросу вы можете использовать ElasticSearch Update By Query Plugin для ES 1.7. Btw: для более новых версий ES эта функция встроена: Update By Query API
Вот пример синтаксиса для плагина:
curl -XPOST 'localhost:9200/index1/_update_by_query' -d '
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"Category": "YourCategoryValueToSearchFor"
}
}
]
}
}
}
},
"script" : "ctx._source.category = \"NewCategoryValue\"; ctx._source.category2 = \"OptionallyUpdateAnotherField\";"
}'
Для этого вам дополнительно придется включить скриптов в вашем elasticsearch. yml config:
script.disable_dynamic: false
script.inline: on
script.indexed: on
Хм спасибо. Я обнаружил, что док. Однако предположим, что у меня нормализованный документ, который имеет что-то вроде поля «Категория». И мне нужно обновить категорию для всех соответствующих ей документов. Есть ли способ сделать это напрямую, не запрашивая их, а затем составляя запрос на обновление из результатов? Я говорю о 1.000.000+ документах, поэтому было бы не очень дешево реализовывать в php, например. – overburn
ahh okay. Я обновил свой ответ для вас! – Hansa
спасибо человеку, мне это удалось. – overburn