Освоим адресацию документов и чтение поискового ответа. Индекс — это коллекция с общей схемой, а не аналог отдельного SQL-индекса.
Примеры course-products используют учебную схему и товар из главы 5 «Mapping и типы полей». Разборы упражнений ниже используют отдельный публичный набор тренажёра.
- Документ как единица поиска
- HTTP-контракт
- Чтение hits
Освоим адресацию документов и чтение поискового ответа. Индекс — это коллекция с общей схемой, а не аналог отдельного SQL-индекса.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
Документ как единица поиска
Документ содержит JSON-поля, а индекс задаёт правила их интерпретации. _id уникален внутри индекса; одинаковые _id в разных индексах допустимы. _source хранит исходное представление документа и не является самим поисковым индексом. Для каталога удобно выбирать стабильный идентификатор товара: повторная доставка события тогда обновляет ту же сущность, а не создаёт дубликат.
СамопроверкаHTTP-контракт
GET /products/_doc/sku-1 читает документ по идентификатору, а POST /products/_search выполняет поиск. PUT с известным _id индексирует новое представление документа; обновление через _update использует отдельный контракт. Статус HTTP сообщает об исходе запроса, но пакетный API может вернуть HTTP 200 с ошибками отдельных операций. Всегда читайте тело ответа.
СамопроверкаЧтение hits
hits.hits содержит текущую страницу, hits.total — сведения о количестве совпадений. relation=eq означает точное число, gte — нижнюю границу. took измеряет серверную работу поиска и не включает всю сетевую задержку пользователя. _shards и timed_out помогают заметить неполное выполнение: HTTP 200 сам по себе не доказывает полноту выдачи.
Ответ чтения одного документа не имеет обёртки hits.
GET /course-products/_doc/sku-1Ответ Elasticsearch
{
"_index": "course-products",
"_id": "sku-1",
"found": true,
"_source": {
"name": "Running headphones",
"price": 99
}
}Как читать результат
Ответ чтения одного документа не имеет обёртки hits.
Разбор на примере каталога
Пусть запрос вернул size=10, массив из 10 товаров и total={value:10000, relation:"gte"}. Это не доказывает, что найдено ровно 10 000 товаров: число является нижней границей. Для интерфейса можно показывать «10 000+», а для точного подсчёта осознанно включить track_total_hits=true с учётом затрат. Если один shard завершился ошибкой, частичный ответ может выглядеть правдоподобно. Продукт должен решить, разрешена ли неполная выдача, и проверять этот контракт независимо от кода HTTP.
СамопроверкаСамопроверка
Сначала ответьте самостоятельно, затем раскройте объяснение.
1. Где уникален _id?
Внутри одного индекса.
2. Что хранит _source?
Представление документа для возврата и ряда операций, а не инвертированный индекс.
3. Почему hits.hits короче hits.total?
Первое — страница, второе — количество совпадений или его нижняя граница.
4. Что означает gte?
Фактическое количество не меньше указанного значения.
5. Достаточно ли HTTP 200?
Нет: проверьте timed_out, ошибки шардов и результаты отдельных bulk-операций.
Краткая памятка
- Внутри одного индекса.
- Представление документа для возврата и ряда операций, а не инвертированный индекс.
- Первое — страница, второе — количество совпадений или его нижняя граница.
- Фактическое количество не меньше указанного значения.
- Нет: проверьте timed_out, ошибки шардов и результаты отдельных bulk-операций.
Официальная документация
Готовы применить знания?
Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.