Какие типы данных (data types) поддерживаются в Elasticsearch для полей?

«Какие типы данных (data types) поддерживаются в Elasticsearch для полей?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Elasticsearch предоставляет богатый набор типов данных для точного отражения природы информации и оптимизации поиска и агрегаций. Вот основные категории:

1. Текстовые типы

  • text: Для полнотекстового поиска. Значение анализируется (разбивается на токены, применяются фильтры). Не используется для сортировки или точных агрегаций.
  • keyword: Для точного совпадения, фильтрации, сортировки, агрегаций. Значение не анализируется, хранится как есть. Критически важен для полей вроде status, tags, id.

2. Числовые типы

  • Целочисленные: byte, short, integer, long.
  • С плавающей точкой: half_float, float, double, scaled_float (удобен для цен, хранит long с заданным масштабом).
  • Почему выбор важен: Влияет на размер индекса и производительность. Использую минимально достаточный тип (например, integer вместо long).

3. Дата и время

  • date: Может принимать строки в множестве форматов (настраивается), числовые timestamp'ы в миллисекундах или секундах.
    "created_at": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||epoch_millis" }

4. Геопространственные типы

  • geo_point: Для широты/долготы (например, {"lat": 52.52, "lon": 13.40}). Позволяет искать точки в радиусе, сортировать по расстоянию.
  • geo_shape: Для сложных фигур (полигоны, линии). Используется для геозон.

5. Специальные типы

  • boolean: true/false.
  • binary: Для хранения Base64-кодированных бинарных данных (например, небольшие файлы). Не индексируется для поиска.
  • ip: Для IPv4/IPv6 адресов. Позволяет диапазонный поиск.
  • completion и search_as_you_type: Для реализации автодополнения (suggesters).

6. Типы для сложных объектов

  • object: Для вложенных JSON-объектов. Поля внутри индексируются «сплющенными».
  • nested: Для массивов объектов, где нужно сохранить независимость объектов. Требует специальных nested-запросов и агрегаций.
    "orders": {
      "type": "nested",
      "properties": {
        "product": { "type": "keyword" },
        "price": { "type": "float" }
      }
    }

7. Псевдо-типы

  • alias: Определяет псевдоним для существующего поля.

Пример маппинга для профиля пользователя:

PUT /users
{
  "mappings": {
    "properties": {
      "username": { "type": "keyword" },
      "bio": { "type": "text" },
      "age": { "type": "integer" },
      "registration_date": { "type": "date" },
      "last_login_ip": { "type": "ip" },
      "home_location": { "type": "geo_point" },
      "settings": {
        "type": "object",
        "properties": {
          "email_notifications": { "type": "boolean" }
        }
      }
    }
  }
}

Правильный выбор типа данных — это основа производительности и корректности поиска в Elasticsearch.