Ответ
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.