Обновить вложенное поле для миллионов документов

Я использую массовое обновление со скриптом, чтобы обновить вложенное поле, но это очень медленно:

POST index/type/_bulk

{"update":{"_id":"1"}}
{"script"{"inline":"ctx._source.nestedfield.add(params.nestedfield)","params":{"nestedfield":{"field1":"1","field2":"2"}}}}
{"update":{"_id":"2"}}
{"script"{"inline":"ctx._source.nestedfield.add(params.nestedfield)","params":{"nestedfield":{"field1":"3","field2":"4"}}}}

 ... [a lot more splitted in several batches]

Вы знаете другой способ, который может быть быстрее?

Кажется возможным сохранить сценарий, чтобы не повторять его для каждого обновления, но я не смог найти способ сохранить "динамические" параметры.

1 ответ

Решение

Как часто с вопросами оптимизации производительности, нет однозначного ответа, так как есть много возможных причин плохой производительности.

В вашем случае вы делаете большую часть update Запросы. Когда update выполняется, документ фактически переиндексируется:

... обновить документ - значит извлечь его, изменить, а затем переиндексировать весь документ.

Следовательно, имеет смысл взглянуть на советы по настройке производительности индексации. Первые несколько вещей, которые я бы рассмотрел в вашем случае, это выбор правильного массового размера, использование нескольких потоков для массовых запросов и увеличение / отключение интервала обновления индексации.

Вы также можете рассмотреть возможность использования готового клиента, который поддерживает параллельные массовые запросы, как это делает клиент Pythonasticsearch.

Было бы идеально следить за показателями производительности ElasticSearch, чтобы понять, где находится узкое место, и если ваши изменения производительности дают реальный выигрыш. Вот обзорная запись блога о показателях производительности ElasticSearch.

Другие вопросы по тегам