Инвертированный индекс строится по словам из текста. Но в карточке блюда не только текст: есть цена, рейтинг, теги, дата добавления, признак «в наличии». По цене не ищут слова, по ней сравнивают и сортируют. Elasticsearch должен знать, какое поле что хранит. В этом уроке разберёмся, из чего состоит индекс и как описать его поля.
Документ и индекс
Данные в Elasticsearch хранятся документами: это объекты JSON. Блюдо «Гонца» выглядит так:
{
"name": "Пицца Маргарита",
"price_rub": 489,
"rating": 4.7,
"available": true,
"added_on": "2026-06-30",
"tags": ["hit", "vegetarian"]
}
Документы одного рода живут в одном индексе: блюда в dishes, рестораны в restaurants, отзывы в reviews. Если сравнивать с базой данных, индекс похож на таблицу, а документ на строку. Только строки таблицы жёстко следуют схеме, а документ JSON может содержать вложенные объекты и массивы.
У каждого документа есть _id, уникальный внутри индекса. А сам JSON хранится в поле _source: его Elasticsearch возвращает в ответе на поиск.
Маппинг
Маппинг это схема индекса: какие поля есть и какого они типа. От типа зависит, как поле хранится и что с ним можно делать.
Главные типы:
| Тип | Что хранит | Что с ним делают |
|---|---|---|
text | текст для поиска: названия, описания | разбирается анализатором на термины, ищется по словам |
keyword | точное значение: тег, кухня, статус | ищется целиком, по нему группируют и сортируют |
integer, long, float, double | числа | сравнения, диапазоны, суммы, сортировка |
date | дата и время | диапазоны, гистограммы по времени |
boolean | да или нет | фильтры |
object, nested | вложенный объект | поиск по полям внутри |
geo_point | координаты | поиск рядом, карта |
Самое важное различие в этой таблице: text против keyword. Название блюда «Пицца с грибами» нужно находить по слову «грибы»: это text. Кухню «Итальянская» нужно точно отфильтровать и посчитать, сколько блюд в каждой: это keyword. Подробно об этом в уроке про match и term.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.