Sobes.tech
Назад к вопросам
Middle
4

Как вы обрабатывали глубокую пагинацию? Если пользователь хочет увидеть 100-ю страницу результатов, используя стандартные from/size в Elasticsearch, это очень дорого с точки зрения памяти. Использовали ли вы Search After?

Компании, где спрашивали
AndersenAndersen

Ответ от нейросети

sobes.tech AI

Для обработки глубокой пагинации в Elasticsearch действительно неэффективно использовать параметры from и size при больших значениях from, так как это приводит к большому потреблению памяти и снижению производительности.

Вместо этого часто применяют механизм search_after, который позволяет эффективно получать следующую страницу результатов, используя значения сортировки последнего элемента предыдущей страницы. Это работает как курсор, позволяя избежать пропуска большого количества документов.

Пример использования search_after в запросе:

{
  "size": 10,
  "query": { "match_all": {} },
  "sort": [
    {"timestamp": "asc"},
    {"_id": "asc"}
  ],
  "search_after": ["2023-01-01T00:00:00", "some_id"]
}

В Go-клиенте для Elasticsearch можно сформировать такой запрос, передавая значения search_after из последнего элемента предыдущей страницы.

Таким образом, для просмотра 100-й страницы лучше последовательно получать страницы, используя search_after, чем делать from=990 и size=10.

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