7.04. Справочник по Elasticsearch
Справочник по Elasticsearch
Общая архитектура и уровни настроек
Elasticsearch предоставляет три уровня управления конфигурацией:
- Конфигурационные файлы — постоянные настройки, задаваемые в
elasticsearch.yml(основной файл),jvm.options,log4j2.properties. - Кластерные настройки — динамически изменяемые параметры через Cluster Settings API, разделённые на:
- Persistent — сохраняются после перезапуска кластера.
- Transient — действуют до перезапуска узла или кластера.
- Настройки индекса — применяются к отдельным индексам или шаблонам индексов, включают маппинг и параметры хранения.
Все эти уровни могут взаимодействовать: например, кластерные настройки переопределяют значения из elasticsearch.yml, а настройки индекса — поведение по умолчанию для конкретных данных.
Основные категории настроек
1. Настройки узла и кластера
Эти параметры определяют идентификацию, сетевое взаимодействие и поведение узлов в кластере.
cluster.name— имя кластера; все узлы с одинаковым именем объединяются в один кластер.node.name— уникальное имя узла внутри кластера.node.roles— список ролей узла, например:master— участие в выборах лидера и управление состоянием кластера.data— хранение и обработка данных.ingest— предварительная обработка входящих документов.ml— выполнение задач машинного обучения.remote_cluster_client— подключение к удалённым кластерам.
path.data— каталоги для хранения данных индексов.path.logs— каталог для логов.bootstrap.memory_lock— блокировка памяти в RAM, предотвращающая свопинг.network.host— IP-адрес или интерфейс, на котором узел принимает соединения.http.port— порт для HTTP-интерфейса (по умолчанию 9200).transport.port— порт для внутреннего транспортного протокола между узлами (по умолчанию 9300).
2. Настройки производительности и ресурсов
indices.memory.index_buffer_size— доля heap-памяти, выделяемая для буферизации индексируемых документов (по умолчанию 10%).thread_pool.*— параметры пулов потоков для различных операций:write— индексация и обновление.search— выполнение поисковых запросов.get— получение документов по ID.bulk— массовые операции.- Каждый пул имеет подпараметры:
size,queue_size,keep_alive.
indices.fielddata.cache.size— максимальный размер кэша fielddata (устаревший механизм, заменён наdoc_values).search.max_buckets— ограничение на количество агрегационных бакетов в одном запросе (по умолчанию 10 000).action.destructive_requires_name— требует явного указания имени индекса при удалении, запрещая использование_all.
3. Настройки отказоустойчивости и безопасности
discovery.seed_hosts— список хостов для начального обнаружения других узлов.cluster.initial_master_nodes— список узлов, участвующих в первоначальном формировании кластера (требуется при первом запуске).xpack.security.enabled— включение модуля безопасности (аутентификация, авторизация, TLS).xpack.monitoring.enabled— сбор метрик мониторинга.xpack.watcher.enabled— включение Watcher для реакции на события.xpack.ml.enabled— активация функций машинного обучения.
Настройки индекса (Index Settings)
Каждый индекс имеет два типа настроек:
- Static settings — задаются при создании индекса и не могут быть изменены без пересоздания.
- Dynamic settings — можно менять в любой момент через Update Index Settings API.
Static settings
index.number_of_shards— количество первичных шардов; фиксируется при создании индекса.index.number_of_routing_shards— базовое число шардов для будущего масштабирования (например, split).index.codec— алгоритм сжатия данных (например,default,best_compression).index.routing.allocation.include/exclude/require— правила размещения шардов на узлах по атрибутам (_name,_ip,_host, пользовательские теги).index.soft_deletes.enabled— включение механизма мягких удалений (по умолчанию включено с версии 7.0).index.hidden— скрытие индекса из обычных операций (используется системными индексами).
Dynamic settings
index.number_of_replicas— количество реплик для каждого шарда.index.refresh_interval— интервал автообновления индекса (по умолчанию1s). Значение-1отключает автообновление.index.max_result_window— максимальное значениеfrom + sizeв поисковых запросах (по умолчанию 10 000).index.max_inner_result_window— аналогично для вложенных агрегаций.index.max_rescore_window— ограничение наrescoreзапросы.index.max_docvalue_fields_search— максимум полейdocvalue_fieldsв одном запросе.index.max_script_fields— максимум полей, вычисляемых скриптами.index.max_ngram_diff— разница междуmax_gramиmin_gramв анализаторах ngram.index.max_shingle_diff— аналогично для shingle-анализаторов.index.blocks.read_only— перевод индекса в режим «только чтение».index.blocks.read— полная блокировка чтения.index.blocks.write— блокировка записи.index.blocks.metadata— блокировка изменения метаданных.
Маппинг (Mapping)
Маппинг определяет структуру документов в индексе: типы полей, анализаторы, индексацию.
Основные поля маппинга
type— тип данных:text— полнотекстовый поиск с анализом.keyword— точное совпадение, агрегации, сортировка.long,integer,short,byte— целые числа.double,float,half_float,scaled_float— числа с плавающей точкой.date— дата и время.boolean— логическое значение.binary— закодированные в base64 данные.object— вложенный объект.nested— массив объектов с независимым контекстом.geo_point,geo_shape— географические данные.ip— IP-адрес.completion— автозаполнение.flattened— динамический объект без строгого маппинга.rank_feature,rank_features— для ранжирования.constant_keyword— поле с фиксированным значением.alias— псевдоним для другого поля.histogram— статистические гистограммы.
Параметры полей
index— индексировать ли поле (true/false).analyzer— анализатор дляtext-полей.search_analyzer— анализатор, используемый только при поиске.norms— хранить ли нормализационные факторы для ранжирования.doc_values— использовать ли колоночное хранение для сортировки и агрегаций.store— хранить ли исходное значение отдельно от_source.fielddata— загружать ли данные в память для сортировкиtext-полей (не рекомендуется).format— формат даты (например,yyyy-MM-dd).ignore_malformed— пропускать некорректные значения вместо ошибки.null_value— значение по умолчанию дляnull.copy_to— копирование значения в другое поле.enabled— отключает индексацию дляobjectили всего документа.dynamic— поведение при появлении новых полей:true— автоматически добавлять.runtime— создавать runtime-поле.strict— выдавать ошибку.false— игнорировать.
Анализаторы (Analyzers)
Анализаторы преобразуют входной текст в токены, которые индексируются и используются при поиске. Каждый text-поле может иметь собственный анализатор или использовать значение по умолчанию.
Стандартные анализаторы
standard— анализатор по умолчанию:- Разбивает текст по пробелам и пунктуации.
- Приводит к нижнему регистру.
- Поддерживает Unicode.
simple— разбивает по не-буквенным символам, приводит к нижнему регистру.whitespace— разбивает только по пробелам.keyword— не разбивает текст, сохраняет как единый токен.pattern— разбивает по регулярному выражению.stop— какsimple, но удаляет стоп-слова.language— морфологические анализаторы для конкретных языков (english,russian,frenchи др.).
Компоненты анализаторов
Анализатор состоит из:
- Tokenizer — обязательный компонент, разбивающий строку на токены.
- Token filters — необязательные фильтры, преобразующие токены:
lowercase— приведение к нижнему регистру.asciifolding— замена диакритических знаков.stemmer— стемминг (например,porter_stem).snowball— морфологический стемминг.synonym— замена синонимов.stop— удаление стоп-слов.ngram,edge_ngram— генерация n-грамм.
- Char filters — предварительная обработка символов:
html_strip— удаление HTML-тегов.mapping— замена отдельных символов.pattern_replace— замена по регулярному выражению.
Настройка пользовательского анализатора
Пример определения в маппинге:
{
"settings": {
"analysis": {
"analyzer": {
"my_russian_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "russian_morphology"]
}
}
}
}
}
Запросы (Queries)
Elasticsearch Query DSL — декларативный язык запросов, основанный на JSON.
Основные типы запросов
match— полнотекстовый поиск с анализом.match_phrase— фразовый поиск.term— точное совпадение (дляkeyword, чисел, дат).terms— совпадение с одним из значений списка.range— диапазон значений (gte,lte,gt,lt).exists— проверка наличия поля.prefix,wildcard,regexp— поиск по шаблону.fuzzy— нечёткий поиск (Levenshtein distance).bool— комбинирование запросов:must— обязательные условия.should— альтернативные условия.must_not— исключения.filter— условия без влияния на релевантность.
multi_match— поиск по нескольким полям.query_string— синтаксис Lucene в строке.simple_query_string— упрощённый синтаксис без ошибок разбора.nested— запрос к вложенным объектам.has_child,has_parent— связь между родительскими и дочерними документами.geo_distance,geo_bounding_box,geo_polygon— геопространственные запросы.
Параметры поиска
from,size— пагинация._source— фильтрация возвращаемых полей.sort— сортировка по полю, скрипту или геодистанции.highlight— подсветка совпадений.aggregations— аналитические группировки.explain— детализация расчёта релевантности.track_total_hits— управление точностью общего числа результатов.min_score— минимальный порог релевантности.timeout— ограничение времени выполнения.
Агрегации (Aggregations)
Агрегации позволяют выполнять аналитику поверх данных: группировки, статистика, гистограммы.
Типы агрегаций
- Bucket aggregations — создают корзины (группы):
terms— группировка по значениям поля.date_histogram— временные интервалы.range— числовые диапазоны.histogram— числовые бакеты фиксированного размера.filters— несколько условий одновременно.geohash_grid— географическая сетка.children,parent,nested— агрегации по иерархии.
- Metric aggregations — вычисляют метрики:
avg,sum,min,max,stats,extended_stats.cardinality— приблизительное число уникальных значений.percentiles,percentile_ranks.top_hits— наиболее релевантные документы в бакете.
- Pipeline aggregations — работают с результатами других агрегаций:
derivative— производная.moving_avg— скользящее среднее.cumulative_sum— накопительная сумма.bucket_script— произвольные вычисления через скрипты.
Параметры агрегаций
size— количество возвращаемых бакетов.shard_size— количество бакетов на шард (для повышения точности).min_doc_count— минимальное число документов в бакете.order— сортировка бакетов.missing— значение по умолчанию для отсутствующих полей.collect_mode— стратегия сбора данных (depth_first,breadth_first).
Runtime-поля (Runtime Fields)
Runtime-поля вычисляются при запросе, не хранятся на диске.
Особенности
- Определяются в маппинге или в теле запроса.
- Используют Painless-скрипты.
- Могут ссылаться на другие поля, включая
_source. - Поддерживают все типы данных, кроме
text(но можно создатьkeywordна основе текста). - Увеличивают время выполнения запроса, но экономят место на диске.
Пример
{
"runtime_mappings": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['timestamp'].value.dayOfWeekEnum.toString())"
}
}
}
}
Searchable Snapshots
Searchable Snapshots позволяют выполнять поиск непосредственно по данным в репозитории снапшотов, без полной загрузки в кластер.
Режимы
- Cold tier — частичная загрузка: только метаданные и индексные структуры.
- Frozen tier — минимальная загрузка: только при необходимости чтения данных.
Преимущества
- Снижение затрат на хранение горячих данных.
- Возможность анализа архивных данных без восстановления.
Ограничения
- Медленный поиск.
- Нет поддержки
update,delete,reindex.
Использование
POST /_snapshot/my_repo/my_snapshot/_mount?wait_for_completion=true
{
"index": "logs-2020",
"renamed_index": "logs-2020-frozen",
"index_settings": {
"index.number_of_replicas": 0
},
"ignore_index_settings": ["index.refresh_interval"]
}
Async Search
Асинхронный поиск позволяет выполнять длительные запросы без таймаута.
Особенности
- Запрос возвращается немедленно с ID.
- Результаты можно получать частями.
- Поддерживает пагинацию и отмену.
API
POST /_async_search— запуск.GET /_async_search/{id}— получение результата.DELETE /_async_search/{id}— отмена.
Параметры
keep_alive— время хранения результата (по умолчанию 5d).wait_for_completion_timeout— максимальное время синхронного ожидания.
SQL over Elasticsearch
Elasticsearch предоставляет SQL-интерфейс для выполнения запросов через REST API.
Поддерживаемые операции
SELECTSHOW TABLES,SHOW COLUMNSDESCRIBE
Ограничения
- Нет поддержки
JOIN,SUBQUERY,UNION. - Нет DDL/DML (
CREATE,INSERT,UPDATE).
Пример
POST /_sql
{
"query": "SELECT avg(price) FROM sales WHERE region = 'EU' GROUP BY product"
}
Также доступен JDBC-драйвер и CLI-клиент.
Event Query Language (EQL)
EQL — язык для поиска последовательностей событий во временных рядах.
Особенности
- Поддержка
sequence,join,pipe. - Оптимизирован для безопасности и логов.
Пример
POST /my-logs/_eql/search
{
"query": """
sequence by process_id
[process where event_type == "start"]
[process where event_type == "stop"]
"""
}
Vector Search
Поддержка поиска по векторным представлениям (embedding).
Тип поля
dense_vector— фиксированной длины массив чисел.sparse_vector— разреженный вектор (начиная с 8.10).
Настройки
index—true/false.similarity—l2_norm,dot_product,cosine.index_options—ef_construction,m.
Поиск
knn— k-nearest neighbors.script_score— кастомные функции расстояния.
Пример
PUT my-index
{
"mappings": {
"properties": {
"embedding": { "type": "dense_vector", "dims": 768, "index": true, "similarity": "cosine" }
}
}
}
POST my-index/_search
{
"knn": {
"field": "embedding",
"query_vector": [...],
"k": 5,
"num_candidates": 10
}
}
Enrich Processors
Обогащение документов данными из других индексов при индексации.
Типы политик
match— точное совпадение.geo_match— географическое совпадение.
Этапы
- Создание политики обогащения.
- Выполнение
enrich.execute_policy. - Использование процессора
enrichв ingest pipeline.
Пример
PUT /_enrich/policy/user_lookup
{
"match": {
"indices": ["users"],
"match_field": "email",
"enrich_fields": ["name", "department"]
}
}
POST /_enrich/policy/user_lookup/_execute
PUT _ingest/pipeline/enrich_user
{
"processors": [
{
"enrich": {
"policy_name": "user_lookup",
"field": "user_email",
"target_field": "user_info"
}
}
]
}
System Indices
Системные индексы начинаются с точки (.) и используются внутренними функциями.
Примеры
.security-*— пользователи, роли..watches,.triggered_watches— Watcher..ml-*— Machine Learning..transform-*— Transform jobs..monitoring-*— мониторинг..kibana_*— данные Kibana.
Управление
- Скрыты по умолчанию.
- Не удаляются обычными командами.
- Имеют специальные права доступа.
Cluster Coordination
Механизм выбора лидера и согласования состояния кластера.
Компоненты
- Master-eligible nodes — участвуют в выборах.
- Voting configuration — набор узлов, имеющих право голоса.
- Quorum — большинство голосов для принятия решений.
Настройки
cluster.initial_master_nodes— обязательна при первом запуске.discovery.seed_hosts— список узлов для обнаружения.cluster.routing.allocation.enable— управление размещением шардов.
Проблемы
- Split-brain — разделение кластера на части.
- Master flapping — частая смена лидера.
Recovery и Allocation
Процессы восстановления и размещения шардов.
Recovery Types
- Peer recovery — между узлами.
- Snapshot recovery — из снапшота.
- Local recovery — после перезапуска узла.
Allocation Settings
cluster.routing.allocation.enable—all,primaries,new_primaries,none.index.routing.allocation.*— правила размещения по атрибутам.cluster.routing.allocation.disk.*— пороги использования диска.
Мониторинг
_cat/recovery_cluster/allocation/explain
Shard Management
Управление шардами: количество, размер, балансировка.
Рекомендации
- Шард не должен превышать 50 ГБ.
- Избегать слишком большого числа шардов (>1000 на узел).
- Использовать
shrinkиsplitдля изменения количества.
API
_shrink— уменьшение числа шардов._split— увеличение (требуетindex.number_of_routing_shards)._rollover— создание нового индекса по условию.
Plugins
Расширения функциональности Elasticsearch.
Типы
- Core plugins — встроены (например,
ingest-attachment,analysis-icu). - Community plugins — сторонние (например,
elasticsearch-sql).
Управление
bin/elasticsearch-plugin listbin/elasticsearch-plugin install namebin/elasticsearch-plugin remove name
REST API Reference
Основные категории API:
- Document APIs:
index,get,delete,update,bulk. - Search APIs:
search,scroll,msearch,explain,validate. - Index APIs:
create,delete,close,open,refresh,flush. - Cluster APIs:
health,state,stats,pending_tasks,reroute. - Cat APIs: человекочитаемые таблицы (
_cat/indices,_cat/nodes). - Tasks API: управление фоновыми задачами.
- Scripts API: управление скриптами.
Painless Scripting
Встроенный язык скриптов, безопасный и быстрый.
Контексты
- Ingest — при обработке документа.
- Update — при обновлении.
- Score — при ранжировании.
- Aggregation — в bucket_script и scripted_metric.
Особенности
- Строгая типизация.
- Нет доступа к файловой системе или сети.
- Автоматическая компиляция и кэширование.
Пример
if (doc['price'].value > 100) {
emit('expensive');
} else {
emit('cheap');
}
Performance Tuning
Heap
- Не более 50% RAM, максимум 32 ГБ.
- Отключить свопинг (
bootstrap.memory_lock: true).
Storage
- SSD предпочтительны.
- Отдельный диск для данных и логов.
Indexing
- Использовать bulk-запросы.
- Отключить
refresh_intervalпри массовой загрузке. - Увеличить
translog.flush_threshold_size.
Searching
- Ограничивать
sizeиfrom. - Использовать
filterвместоmustпри возможности. - Избегать
script_fieldsв production.
Troubleshooting
Частые проблемы
- Yellow/Red cluster status — недостающие реплики или первичные шарды.
- High CPU — сложные скрипты, агрегации, поиск.
- Disk watermark — нехватка места на диске.
- Thread pool rejections — перегрузка пулов потоков.
Инструменты
_cluster/health_nodes/stats_tasks_cat/thread_pool- Slow logs (
index.search.slowlog.threshold.query.warn)