2016-01-03 6 views
16

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

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

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

ответ

23

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

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

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

2

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

индекс будет добавить или заменить документ в качестве необходимого

Кроме того, при обновлении документа, было бы целесообразно, чтобы добавить флаг «doc_as_upsert». Более подробная информация here и here

5

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

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

+0

Предположим, вы могли бы потенциально заменить данный документ много раз (например, многократно индексировать один и тот же документ). Поскольку ES не действительно «удаляет» что-либо, не добавляете ли вы все больше и больше документов и увеличиваете их номер версии, оставляя их сборщику мусора позже, чтобы очистить старые версии? В этом случае не используется индекс vs create, чтобы раздувать ваш индекс в краткосрочной перспективе, что может повлиять на производительность? И не будет ли будущее использование мусора в будущем также повлиять на производительность? Это настоящий вопрос, который мне интересен, а не риторический. Спасибо – cwarny

+0

Но когда вы обновляете документ, разве он не извлекает, не изменяет и не индексирует его? При обновлении целого документа мы сказали, что способ обновления документа - получить его, изменить, а затем переиндексировать весь документ. Это правда. Однако, используя API обновлений, мы можем сделать частичные обновления, такие как увеличение счетчика в одном запросе. Мы также сказали, что документы неизменяемы: они не могут быть изменены, заменены только. API обновления должен подчиняться тем же правилам. –

Смежные вопросы