Раздел 40 · Elasticsearch и ELK

Сортировка и пагинация: from/size и search_after

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

По умолчанию Elasticsearch сортирует найденное по _score и отдаёт первые 10. Но у экрана каталога «Гонца» есть кнопка «сначала дешёвые», а внизу «показать ещё». Разберём, как сортировать по полю и как правильно листать результаты.

Сортировка по полю

Сортировка задаётся массивом sort:

"sort": [ { "price_rub": "asc" }, { "rating": "desc" } ]

Сначала по цене по возрастанию, при одинаковой цене по рейтингу по убыванию. Специальное поле _score тоже можно указать в списке: { "_score": "desc" }.

Две вещи стоит запомнить:

  • Сортировать можно по keyword, числам и датам, но не по text. Поле text разбито на термины, и сортировать по нему нечего: ответ будет той же ошибкой про fielddata, что и у агрегации. Сортируют по подполю name.keyword.
  • При сортировке по полю _score не считается, в ответе будет "_score": null. Если оценка нужна, добавь "track_scores": true или поставь _score в sort.

В каждом найденном документе появится массив sort со значениями, по которым его упорядочили. Он пригодится для пагинации.

from и size

Простейшая пагинация: "from": 20, "size": 10 значит «пропусти 20, покажи следующие 10», то есть третью страницу. Это удобно для номеров страниц.

Но у неё дорогая природа. Чтобы показать документы с 9990 по 10000, каждый шард должен найти и отсортировать свои 10 000 лучших, а потом координатор из них выбрать. Чем глубже страница, тем дороже. Поэтому Elasticsearch по умолчанию запрещает from + size больше 10 000 (index.max_result_window). Это не ошибка настройки, а защита: людям не нужна тысячная страница, а роботам есть способы лучше.

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.