Update API

Тема дорожной карты · Elasticsearch

Update API в Elasticsearch изменяет существующий документ в индексе по адресу POST /<index>/_update/<id>, не требуя от клиента сначала извлекать документ, изменять его локально и переиндексировать целиком. В простейшей форме Update API использует ключ doc, содержащий только изменяемые поля: Elasticsearch объединяет переданный частичный документ с существующим хранимым документом, оставляя все остальные поля нетронутыми. Для более сложной логики обновления Update API также принимает ключ script со встроенным скриптом на языке Painless (например, "source": "ctx._source.counter += params.increment"), который может выполнять условную логику, операции с массивами и арифметические действия над текущим состоянием документа. Внутренне обновление документа в Elasticsearch — это не изменение на месте: поисковый движок извлекает текущий документ из шарда, применяет изменение, удаляет старую версию документа и индексирует новую, поэтому обновления работают медленнее, чем чистые операции индексирования. Чтобы предотвратить гонки условий при одновременном обновлении одного документа несколькими процессами, используйте параметры if_seq_no и if_primary_term из предыдущего ответа Get API для реализации оптимистичного управления параллелизмом в Elasticsearch.

Как это работает

Update API: Index API (PUT /index/_doc/id — create/replace), Get API (GET /index/_doc/id), Update API (POST /index/_update/id — partial update через script или doc), Delete API (DELETE /index/_doc/id), Bulk API (POST /_bulk с newline-delimited actions). Bulk обязателен для high-throughput индексации — single-doc indexing жжёт ресурсы. ES near real-time (NRT): writes ищутся через ~1 секунду (refresh interval).

Когда применять

Bulk API для любой sustained индексации — batch 5-15MB типично. Тюньте refresh_interval в -1 во время bulk-загрузок, потом 1s для normal use — экономит IO + heap. Updates в ES = delete + re-index под капотом — частые updates фрагментируют индексы. Для deletes — reindex-with-filter лучше многих delete-by-query.

Типичные ошибки

Ловушки Update API: single-doc indexing в hot loop (кластер ползёт); Bulk batches слишком большие (>100MB — OOM); не handle bulk partial failures (часть items падают, игнор); update API для очень частых updates (delete+re-index churn).

Связанные понятия

Полезные ресурсы