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'. Подробнее здесь и здесь