#elasticsearch
#elasticsearch
Вопрос:
Согласно документации ES, индексирование / удаление документа происходит следующим образом:
- Запрос получен на одном из узлов.
- Запрос перенаправлен на основной сегмент документа.
- Операция, выполняемая над основным сегментом, и параллельные запросы, отправленные на узлы-реплики.
- Основной сегментный узел ожидает ответа от узлов-реплик, а затем отправляет ответ на узел, где запрос был первоначально получен.
- Отправьте ответ обратно клиенту.
Теперь в моем случае я отправляю запрос на создание документа в 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.
Несколько вещей, которые вы можете попробовать:
Обратите внимание, что обновление индекса при каждом запросе на индексацию ужасно сказывается на производительности, что вызывает вопрос о том, почему вы пытаетесь удалить документ сразу после его индексации.
Ответ №2:
Добавить
deleteByQueryRequest.setAbortOnVersionConflict(false);