Как с помощью Elasticsearch получить более 1 000 000 записей?

Добрый день!

В каталоге Elasticsearch хранятся более 1 млн. товаров. Я вытягиваю id товаров из эластика, если вытягивать ±10 000 товаров, то нормально, но к примеру если вытягивать большее количество, то уже соответственно съедается оперативная память.

Есть ли способ вытянуть 1 млн. товаров блоками, например по 1 000 на 10 блоков. Тоесть берем записи блока, проводим процедуры над ним, чистим в памяти и переходим к следующему блоку и т.д.?
  • Вопрос задан
  • 793 просмотра
Решения вопроса 1
kruslan
@kruslan
В чём именно проблема? Алгоритм простой-же:

1. lastId = null
2. query = [] // получаем все записи
3. Если null != lastId - в query добавляем условие: id > lastId
4. Получаем n записей с сортировкой по id
5. Обрабатываем полученное
6. В lastId закидываем id последней полученной записи
7. Если получено больше 0 записей - повторяем с п.3
8. Профит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Flying
Выбирать произвольное количество результатов из Elasticsearch можно с использованием scroll API.

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

У меня в проекте приходилось итерировать через scroll и больше миллиона документов - нормально работает.
Ответ написан
inoise
@inoise
Solutions Architect, AWS Certified, Serverless
Для начала запомнить что эластик самая прожорливая тварь на этом свете по ресурсам. Потом вспомнить что эластик это поисковый индекс, а не база данных и доставать из него больше десятка(условно) записей считается преступлением. Потом узнаем что у эластика есть лимиты на максимальную длину индекса для одного запроса и он настраивается (читать про индексы). Перестать это делать по тому что там все-равно есть аппаратные лимиты
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы