Elasticsearch Bulk API - Индекс против создания/обновления

Я использую Elasticsearch Bulk API для создания или обновления документов.

Я действительно знаю, что они создают или обновляют, но я могу упростить свой код, просто сделав все index или "upserts" в смысле SQL.

Есть ли недостаток в использовании index (и позволяет ES выяснить его) с использованием более явных create и update?

Ответы

Ответ 1

Если вы отправляете create, вы должны убедиться, что документ еще не существует в вашем индексе, иначе вызов завершится неудачно, тогда как отправка того же документа с помощью index всегда будет успешной.

Затем, если по соображениям производительности вы знаете, что создадите документ (с помощью create или index), а затем вы обновите только несколько свойств, тогда использование update может иметь смысл.

В противном случае, если вы всегда отправляете полные документы, я бы использовал index все время для создания и обновления. Всякий раз, когда он видит действие index, ES будет либо создавать документ, если он не существует, либо заменить его, если он существует, но вызов всегда будет успешным.

Ответ 2

Короткий ответ: Нет никаких недостатков.

Конечная точка создания и обновления - это особые случаи. При создании вы ничего не хотите делать, если документ уже существует. При обновлении вы можете предоставить меньше данных, если у вас нет всех данных документа, которые вы могли бы просто добавить несколько полей. Вы также можете убедиться, что документ индексируется только в том случае, если он уже существует с обновлением.

Ответ 3

Вы не сможете использовать индекс для всего. Согласно docs:

индекс добавит или заменит документ при необходимости

Кроме того, если вы обновляете документ, возможно, стоит добавить флаг 'doc_as_upsert'. Подробнее здесь и здесь