Конфликт версий Elasticsearch delete_by_query

#elasticsearch

#elasticsearch

Вопрос:

Согласно документации ES, индексирование / удаление документа происходит следующим образом:

  1. Запрос получен на одном из узлов.
  2. Запрос перенаправлен на основной сегмент документа.
  3. Операция, выполняемая над основным сегментом, и параллельные запросы, отправленные на узлы-реплики.
  4. Основной сегментный узел ожидает ответа от узлов-реплик, а затем отправляет ответ на узел, где запрос был первоначально получен.
  5. Отправьте ответ обратно клиенту.

Теперь в моем случае я отправляю запрос на создание документа в ES в момент времени t, а затем отправляю запрос на удаление того же документа (с использованием delete_by_query) примерно через t 800 миллисекунд. Эти запросы отправляются через систему обмена сообщениями (внутренняя реализация kafka), которая гарантирует, что запрос на удаление будет отправлен в ES только после получения ответа 200 OK на операцию индексации от ES.

Согласно документации ES, delete_by_query выдает конфликт версий 409 только тогда, когда документы, присутствующие в запросе на удаление, были обновлены во время выполнения delete_by_query.

В моем случае всегда гарантируется, что запрос delete_by_query будет отправлен в ES только тогда, когда получен ответ 200 OK для всех документов, которые должны быть удалены. Следовательно, нет возможности обновить / создать документ, который должен быть удален во время операции delete_by_query.

Пожалуйста, дайте мне знать, если я что-то упустил или это проблема с ES.

Комментарии:

1. Могу я спросить вас, в чем проблема? Возвращает ли ES ошибку, когда этого не должно быть, или наоборот? Я не могу понять это из описания.

2. ES возвращает конфликт версий для _delete_by_query, когда этого не должно быть.

Ответ №1:

Возможная причина может быть связана с тем, что при создании документа он не сразу «фиксируется» в индексе.

Индексы Elasticsearch работают с интервалом refresh_interval, который по умолчанию равен 1 секунде.

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

Несколько вещей, которые вы можете попробовать:

  1. Отправьте _refresh с вашим запросом
  2. Добавить ?обновить=wait_for или ?обновить=true параметр

Обратите внимание, что обновление индекса при каждом запросе на индексацию ужасно сказывается на производительности, что вызывает вопрос о том, почему вы пытаетесь удалить документ сразу после его индексации.

Ответ №2:

Добавить

 deleteByQueryRequest.setAbortOnVersionConflict(false);