По умолчанию 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.