Документы, индексы и маппинг

Разбираем базовые сущности Elasticsearch: документ как единицу данных, индекс как коллекцию и маппинг как схему полей.

Документ — это объект JSON, единица данных в Elasticsearch; индекс — именованная коллекция похожих документов.

Документ

В Elasticsearch вы храните не строки таблицы, а документы — обычные JSON-объекты. Один товар, одна статья, одна запись лога — это документ. У каждого документа есть уникальный _id (вы задаёте сами или ES сгенерирует) и поля со значениями.

{
  "title": "Кофемашина DeLonghi",
  "price": 24990,
  "in_stock": true,
  "tags": ["кухня", "кофе"]
}

Индекс

Документы одного вида складывают в индекс. Индекс — это примерно как таблица в SQL: «products», «articles», «logs-2026-06». Поиск, индексация и настройки задаются на уровне индекса. У индекса есть имя (строчными буквами), настройки (число шардов и реплик) и маппинг.

Маппинг — схема полей

Маппинг (mapping) описывает, какие поля есть в индексе и какого они типа. Тип определяет, как поле хранится, индексируется и ищется. Основные типы:

ТипДля чего
textтекст для полнотекстового поиска (анализируется, разбивается на слова)
keywordточные строки: статусы, теги, email (не анализируется, ищется целиком)
integer, long, floatчисла (для диапазонов, сортировки, агрегаций)
dateдата и время
booleantrue/false

Маппинг можно задать явно при создании индекса, а можно положиться на динамический маппинг: ES сам угадает тип по первому документу. Для прода почти всегда задают явно — об этом отдельный урок.

А где «типы документов»?

Если вы читаете старые статьи, там упоминается третий уровень — type (индекс → тип → документ). В ранних версиях в одном индексе могли жить документы разных «типов». Начиная с Elasticsearch 7 это убрали: остались только индексы и документы. Если встретите в коде _doc в URL — это рудимент того механизма. Запомните: один индекс — один вид документов.

Как работает под капотом

Когда вы кладёте документ в индекс, ES для каждого текстового поля прогоняет значение через анализатор, получает термы и дописывает их в инвертированный индекс этого поля. Числовые поля и поля keyword индексируются иначе — в структурах для диапазонов и точных совпадений. Поэтому от типа поля напрямую зависит, как по нему можно искать: по text работает полнотекстовый match, по keyword — точный term, по числу — диапазоны и сортировка.

Частые ошибки

  • Полагаться на динамический маппинг в проде. ES может угадать строку как text, когда вам нужен keyword для точной фильтрации, и наоборот.
  • Менять тип уже существующего поля. Так нельзя: тип поля в маппинге неизменяем. Нужно создать новый индекс с правильным маппингом и переиндексировать данные (reindex).

Итоги

  • Документ — это JSON-объект; индекс — коллекция однотипных документов (аналог таблицы).
  • Маппинг описывает поля и их типы; от типа зависит, как поле ищется.
  • «Типы документов» (type) убрали в ES 7 — остались только индексы и документы.
Проверьте себя
1. Что такое индекс в Elasticsearch?
AОдин JSON-документ
BИменованная коллекция однотипных документов, аналог таблицы
CСервер кластера
DТип поля
2. Можно ли изменить тип уже существующего поля в маппинге?
AДа, в любой момент через PUT
BНет, тип поля неизменяем; нужно создать новый индекс и переиндексировать
CДа, но только для числовых полей
DТолько после перезапуска кластера