Мы уже много раз выполняли поиск и смотрели на ответ мельком. Пора разобрать его по полям: в нём есть всё, чтобы понять, что нашлось, сколько и почему именно в таком порядке. Будем искать по отзывам клиентов «Гонца»: служба качества хочет найти жалобы на холодную еду.
Скелет ответа
{
"took": 1,
"timed_out": false,
"_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 },
"hits": {
"total": { "value": 285, "relation": "eq" },
"max_score": 8.664297,
"hits": [ { "_index": "reviews", "_id": "rv1528", "_score": 8.664297, "_source": { ... } } ]
}
}
Сверху служебные поля:
took: сколько миллисекунд Elasticsearch выполнял запрос, без учёта сети. В песочнице время условное;timed_out: не кончилось ли время, отведённое запросу параметромtimeout. Если да, результаты неполные;_shards: на скольких шардах выполнялся запрос и на скольких успешно. Еслиfailedбольше нуля, часть данных не просмотрена, и результаты тоже неполные. Шарды разберём в уроке про кластер.
Главное внутри hits:
total.value: сколько всего документов подошло под запрос. Не сколько вернулось, а сколько нашлось;max_score: лучшая оценка среди найденных;hits: сами документы, не большеsizeштук (по умолчанию 10), отсортированные по_score.
У каждого найденного документа есть индекс, _id, оценка _score и сам документ в _source.
Точный счёт и «не меньше»
Посчитать точное число найденных на миллионах документов дорого: пришлось бы пройти по всем совпадениям, хотя показать надо только первые десять. Поэтому Elasticsearch по умолчанию считает точно только до 10 000. Если совпадений больше, ответ будет "value": 10000, "relation": "gte": «не меньше десяти тысяч». Для экрана «найдено 10 000+» этого хватает.
Порог задаёт параметр track_total_hits. true попросит точный счёт любой ценой, число задаст свой порог, false отключит счёт вовсе.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.