Elasticsearch delete_by_query версия конфликта - PullRequest
0 голосов
/ 27 марта 2019

Согласно документации 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 Ответ

0 голосов
/ 27 марта 2019

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...