Elasticsearch: ответ API UpdateByQuery возвращает неправильный статус
У меня проблема с API UpdateByQuery при попытке обновить документ, которого нет в эластичном поиске.
Описание проблемы
Мы создаем по одному индексу на каждый день, например test_index-2020.03.11, test_index-2020.03.12… и поддерживаем восемь дней (сегодняшние, а также семь дней на прошлой неделе) индексы.
Когда данные прибывают (чтение по одному или сразу из темы Kafka), нам нужно либо обновить (который может существовать в любом из 8-дневных индексов), если данные уже существуют с заданным идентификатором, либо сохранить их, если они не существуют (до текущего дневной индекс).
Решение, которое я пытаюсь сейчас использовать, когда данные поступают один за другим:
Использование UpdateByQuery со встроенным скриптом для обновления документа
Если BulkByScrollResponse возвращает обновленный счетчик 0, сохраните документ.
Вопросы:
Даже если документ не существует, я вижу, что BulkByScrollResponse возвращает обновленное поле как ненулевое (1,2,3,4…) следующим образом
BulkIndexByScrollResponse[sliceId=null,updated=1,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]
Из-за этого не удалось вызвать запрос на сохранение документа.
Как подойти, если необходимо обновить большую часть документов (с набором разных идентификаторов документов) с их соответствующим содержанием с помощью одного запроса? Смогу ли я добиться с помощью UpdateByQuery?
Примечание. Учитывая объем данных, которые нужно обработать в час, нам нужно избегать множественных обращений к Elasticsearch.
Идентификатор документа имеет формат str1:str2: Используется:Sat Mar 14 23:34:39 IST 2020
Но даже если документа не существует, я могу видеть обновленный счет как ненулевой
Добавляем еще пару пунктов о подходе, который я пытаюсь: - В моем случае всегда есть только один документ, который должен обновляться для каждого запроса, поскольку я пытаюсь обновить документ, соответствующий данному идентификатору - Мы настроили шарды и реплики как "number_of_shards": 10, "number_of_replicas": 1 -Мы придерживаемся этого подхода, так как не знаем, в каком индексе находится фактический документ
Если соответствует максимум один документ, то в поле "Обновленное" ответа не должно быть более 1
Ниже приведены несколько выходных данных, которые я получаю как часть ответа: BulkIndexByScrollResponse[sliceId=null,updated=9,created=0,deleted=0,batches=1,versionConflicts=1,noops=0,retries=0,throttledUntil=0s] BulkIndexByScrollResponse[sliceId=null,updated=10,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]