Раздел 40 · Elasticsearch и ELK

Как читать ответ _search

junior~10 мин

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

Мы уже много раз выполняли поиск и смотрели на ответ мельком. Пора разобрать его по полям: в нём есть всё, чтобы понять, что нашлось, сколько и почему именно в таком порядке. Будем искать по отзывам клиентов «Гонца»: служба качества хочет найти жалобы на холодную еду.

Скелет ответа

{
  "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 ₽.

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