Шпаргалка по Elasticsearch: основные команды и советы
Команды Elasticsearch для поиска, индексации и аналитики
Elasticsearch — это мощный распределенный поисковый и аналитический движок, построенный на базе Apache Lucene. Эта всеобъемлющая шпаргалка охватывает основные команды, лучшие практики и быстрые справочники для работы с кластерами Elasticsearch.

Примечание: Большинство примеров в этом руководстве используют cURL для HTTP-запросов. Если вы новичок в использовании cURL или вам нужен быстрый справочник для продвинутых опций, ознакомьтесь с нашей Шпаргалкой по cURL для получения подробной информации о техниках выполнения HTTP-запросов из командной строки.
Управление кластером
Проверка состояния кластера
Все команды в этом разделе используют cURL для взаимодействия с REST API Elasticsearch. Вы можете кастомизировать эти запросы, добавляя дополнительные заголовки, аутентификацию и другие опции по мере необходимости.
# Базовая проверка состояния
curl -X GET "localhost:9200/_cluster/health?pretty"
# Подробное состояние кластера с информацией о шардах
curl -X GET "localhost:9200/_cluster/health?level=shards&pretty"
# Проверка информации о узлах
curl -X GET "localhost:9200/_cat/nodes?v"
# Проверка настроек кластера
curl -X GET "localhost:9200/_cluster/settings?pretty"
Операции с узлами
# Список всех узлов
curl -X GET "localhost:9200/_cat/nodes?v&h=name,node.role,heap.percent,ram.percent,cpu,load_1m"
# Статистика узлов
curl -X GET "localhost:9200/_nodes/stats?pretty"
# Горячие потоки (для устранения неполадок)
curl -X GET "localhost:9200/_nodes/hot_threads"
Управление индексами
Создание и удаление индексов
# Создание индекса
curl -X PUT "localhost:9200/my_index?pretty"
# Создание индекса с настройками
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
'
# Удаление индекса
curl -X DELETE "localhost:9200/my_index?pretty"
# Список всех индексов
curl -X GET "localhost:9200/_cat/indices?v"
# Статистика индекса
curl -X GET "localhost:9200/my_index/_stats?pretty"
Маппинг индексов
# Определение маппинга
curl -X PUT "localhost:9200/products" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"created_at": { "type": "date" },
"tags": { "type": "keyword" },
"description": {
"type": "text",
"analyzer": "english"
}
}
}
}
'
# Получение маппинга
curl -X GET "localhost:9200/products/_mapping?pretty"
# Обновление маппинга (добавление поля)
curl -X PUT "localhost:9200/products/_mapping" -H 'Content-Type: application/json' -d'
{
"properties": {
"category": { "type": "keyword" }
}
}
'
Шаблоны индексов
# Создание шаблона индекса
curl -X PUT "localhost:9200/_index_template/logs_template" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"timestamp": { "type": "date" },
"message": { "type": "text" },
"level": { "type": "keyword" }
}
}
}
}
'
# Список шаблонов
curl -X GET "localhost:9200/_index_template?pretty"
Операции с документами (CRUD)
Создание документов
# Индексация документа с автоматически сгенерированным ID
curl -X POST "localhost:9200/products/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"name": "Laptop",
"price": 999.99,
"tags": ["electronics", "computers"]
}
'
# Индексация документа с конкретным ID
curl -X PUT "localhost:9200/products/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "Laptop",
"price": 999.99
}
'
# Пакетная индексация (Bulk)
curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' -d'
{ "index": { "_index": "products", "_id": "1" }}
{ "name": "Laptop", "price": 999.99 }
{ "index": { "_index": "products", "_id": "2" }}
{ "name": "Mouse", "price": 29.99 }
'
Чтение документов
# Получение документа по ID
curl -X GET "localhost:9200/products/_doc/1?pretty"
# Получение нескольких документов
curl -X GET "localhost:9200/_mget?pretty" -H 'Content-Type: application/json' -d'
{
"docs": [
{ "_index": "products", "_id": "1" },
{ "_index": "products", "_id": "2" }
]
}
'
# Проверка существования документа
curl -I "localhost:9200/products/_doc/1"
Обновление документов
# Обновление документа
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"price": 899.99
}
}
'
# Обновление с использованием скрипта
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"script": {
"source": "ctx._source.price *= params.discount",
"params": {
"discount": 0.9
}
}
}
'
# Upsert (обновление или вставка)
curl -X POST "localhost:9200/products/_update/1?pretty" -H 'Content-Type: application/json' -d'
{
"doc": {
"price": 899.99
},
"doc_as_upsert": true
}
'
Удаление документов
# Удаление по ID
curl -X DELETE "localhost:9200/products/_doc/1?pretty"
# Удаление по запросу
curl -X POST "localhost:9200/products/_delete_by_query?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"name": "old"
}
}
}
'
Поисковые запросы
Базовый поиск
# Совпадение всех
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
# Запрос на совпадение
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"name": "laptop"
}
}
}
'
# Запрос на множественное совпадение
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"multi_match": {
"query": "laptop gaming",
"fields": ["name", "description"]
}
}
}
'
Запросы на уровне терминов
# Термовый запрос (точное совпадение)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"term": {
"tags": "electronics"
}
}
}
'
# Термовый запрос (несколько значений)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"terms": {
"tags": ["electronics", "computers"]
}
}
}
'
# Запрос по диапазону
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 1000
}
}
}
}
'
# Запрос на существование
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"exists": {
"field": "description"
}
}
}
'
Булевы запросы
# Булевый запрос (must, should, must_not, filter)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "name": "laptop" }}
],
"filter": [
{ "range": { "price": { "gte": 500 }}}
],
"should": [
{ "term": { "tags": "gaming" }}
],
"must_not": [
{ "term": { "tags": "refurbished" }}
]
}
}
}
'
Продвинутый поиск
# Запрос с подстановочными знаками
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"wildcard": {
"name": "lap*"
}
}
}
'
# Размытый запрос (терпимость к опечаткам)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"fuzzy": {
"name": {
"value": "laptpo",
"fuzziness": "AUTO"
}
}
}
}
'
# Запрос по префиксу
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"prefix": {
"name": "lap"
}
}
}
'
Агрегации
Метрические агрегации
# Среднее, сумма, минимум, максимум
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"avg_price": { "avg": { "field": "price" }},
"max_price": { "max": { "field": "price" }},
"min_price": { "min": { "field": "price" }},
"total_sales": { "sum": { "field": "price" }}
}
}
'
# Агрегация статистики
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"price_stats": {
"stats": { "field": "price" }
}
}
}
'
Агрегации по корзинкам (Bucket Aggregations)
# Агрегация терминов (группировка)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"popular_tags": {
"terms": {
"field": "tags",
"size": 10
}
}
}
}
'
# Агрегация по диапазону
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 50 },
{ "from": 50, "to": 100 },
{ "from": 100 }
]
}
}
}
}
'
# Гистограмма дат
curl -X GET "localhost:9200/logs/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"logs_over_time": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "day"
}
}
}
}
'
Вложенные агрегации
# Вложенные агрегации
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"categories": {
"terms": { "field": "category" },
"aggs": {
"avg_price": {
"avg": { "field": "price" }
}
}
}
}
}
'
Сортировка и пагинация
# Сортировка по полю
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "price": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}
'
# Пагинация с from/size
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"from": 0,
"size": 10,
"query": { "match_all": {} }
}
'
# Поиск после (для глубокой пагинации)
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"size": 10,
"query": { "match_all": {} },
"sort": [{ "price": "asc" }, { "_id": "asc" }],
"search_after": [100, "product_123"]
}
'
Выбор полей и подсветка
# Выбор конкретных полей
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"_source": ["name", "price"]
}
'
# Подсветка
curl -X GET "localhost:9200/products/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": { "description": "gaming laptop" }
},
"highlight": {
"fields": {
"description": {}
}
}
}
'
Алиасы индексов
# Создание алиаса
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions": [
{ "add": { "index": "products_v1", "alias": "products" }}
]
}
'
# Переключение алиаса на новый индекс (без простоя)
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions": [
{ "remove": { "index": "products_v1", "alias": "products" }},
{ "add": { "index": "products_v2", "alias": "products" }}
]
}
'
# Список алиасов
curl -X GET "localhost:9200/_cat/aliases?v"
Реиндексация
# Реиндексация из одного индекса в другой
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "old_products"
},
"dest": {
"index": "new_products"
}
}
'
# Реиндексация с запросом
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
"source": {
"index": "products",
"query": {
"range": {
"price": { "gte": 100 }
}
}
},
"dest": {
"index": "expensive_products"
}
}
'
Снимки и резервные копии
# Регистрация репозитория снимков
curl -X PUT "localhost:9200/_snapshot/my_backup?pretty" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/mount/backups/my_backup"
}
}
'
# Создание снимка
curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true&pretty"
# Восстановление снимка
curl -X POST "localhost:9200/_snapshot/my_backup/snapshot_1/_restore?pretty"
# Список снимков
curl -X GET "localhost:9200/_snapshot/my_backup/_all?pretty"
# Удаление снимка
curl -X DELETE "localhost:9200/_snapshot/my_backup/snapshot_1?pretty"
Оптимизация производительности
Настройки индекса
# Отключение обновления во время пакетной индексации
curl -X PUT "localhost:9200/products/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"refresh_interval": "-1"
}
}
'
# Включение обновления после пакетной индексации
curl -X PUT "localhost:9200/products/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"refresh_interval": "1s"
}
}
'
# Принудительное слияние (оптимизация)
curl -X POST "localhost:9200/products/_forcemerge?max_num_segments=1&pretty"
Очистка кэша
# Очистка всех кэшей
curl -X POST "localhost:9200/_cache/clear?pretty"
# Очистка конкретного кэша
curl -X POST "localhost:9200/products/_cache/clear?query=true&pretty"
Мониторинг и устранение неполадок
# Ожидающие задачи
curl -X GET "localhost:9200/_cat/pending_tasks?v"
# Статистика пула потоков
curl -X GET "localhost:9200/_cat/thread_pool?v"
# Информация о сегментах
curl -X GET "localhost:9200/_cat/segments?v"
# Информация о восстановлении
curl -X GET "localhost:9200/_cat/recovery?v&h=index,stage,time"
# API задач
curl -X GET "localhost:9200/_tasks?detailed=true&pretty"
Примеры клиента Python
from elasticsearch import Elasticsearch
# Подключение к Elasticsearch
es = Elasticsearch(['http://localhost:9200'])
# Индексация документа
doc = {
'name': 'Laptop',
'price': 999.99,
'tags': ['electronics']
}
es.index(index='products', id=1, document=doc)
# Поиск
resp = es.search(index='products', query={'match': {'name': 'laptop'}})
for hit in resp['hits']['hits']:
print(hit['_source'])
# Пакетная индексация
from elasticsearch.helpers import bulk
actions = [
{
'_index': 'products',
'_id': i,
'_source': {'name': f'Product {i}', 'price': i * 10}
}
for i in range(1000)
]
bulk(es, actions)
Примеры клиента JavaScript/Node.js
JavaScript-клиент Elasticsearch предоставляет типобезопасный способ взаимодействия с вашим кластером. Для приложений, развертываемых в продакшене, рекомендуется использовать TypeScript для повышения типобезопасности и автодополнения. Ознакомьтесь с нашей Шпаргалкой по TypeScript для лучших практик определения типов и интерфейсов.
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });
// Индексация документа
async function indexDoc() {
await client.index({
index: 'products',
id: 1,
document: {
name: 'Laptop',
price: 999.99
}
});
}
// Поиск
async function search() {
const result = await client.search({
index: 'products',
query: {
match: { name: 'laptop' }
}
});
console.log(result.hits.hits);
}
// Пакетная индексация
async function bulkIndex() {
const operations = [];
for (let i = 0; i < 1000; i++) {
operations.push({ index: { _index: 'products', _id: i } });
operations.push({ name: `Product ${i}`, price: i * 10 });
}
await client.bulk({ operations });
}
Пример на TypeScript с сильной типизацией
import { Client } from '@elastic/elasticsearch';
interface Product {
name: string;
price: number;
tags?: string[];
created_at?: Date;
}
const client = new Client({ node: 'http://localhost:9200' });
async function indexProduct(product: Product, id: number): Promise<void> {
await client.index<Product>({
index: 'products',
id: id.toString(),
document: product
});
}
async function searchProducts(query: string): Promise<Product[]> {
const result = await client.search<Product>({
index: 'products',
query: {
match: { name: query }
}
});
return result.hits.hits.map(hit => hit._source as Product);
}
Лучшие практики
Проектирование индексов
- Поддерживайте размер шарда в диапазоне 20–50 ГБ для оптимальной производительности
- Используйте управление жизненным циклом индексов (ILM) для временных рядов данных
- Внимательно проектируйте маппинги перед индексацией данных
- Используйте подходящие типы полей (keyword против text, форматы дат)
- Отключайте
_sourceдля больших документов, если это не требуется
Оптимизация запросов
- Используйте фильтры вместо запросов, когда скоринг не требуется
- Предпочитайте термовые запросы для структурированных данных
- Используйте булевый запрос (
bool) для эффективного объединения нескольких условий - Реализуйте пагинацию с помощью
search_afterдля глубокой пагинации - Кэшируйте часто используемые фильтры
Производительность индексации
- Используйте Bulk API для пакетной индексации (1000–5000 документов на запрос)
- Отключайте обновление (refresh) во время пакетных операций
- Увеличивайте
index.refresh_intervalво время интенсивной индексации - Используйте несколько потоков/работников для параллельной индексации
- Рассмотрите использование маршрутизации для лучшего распределения шардов
Управление кластером
- Регулярно мониторьте состояние кластера
- Настройте правильную конфигурацию реплик
- Используйте выделенные мастер-узлы для больших кластеров
- Реализуйте правильную стратегию резервного копирования с помощью снимков
- Мониторьте использование кучи JVM (держите ниже 75%)
Безопасность
- Включите аутентификацию и авторизацию (X-Pack Security)
- Используйте HTTPS для продакшен-развертываний (настройте cURL с опциями
--cacert,--certи--keyдля SSL/TLS) - Реализуйте надлежащий контроль доступа на основе ролей
- Регулярно выполняйте обновления безопасности и установку патчей
- Шифруйте данные как в покое, так и при передаче
Типичные сценарии использования
Полнотекстовый поиск
Elasticsearch отлично справляется с полнотекстовым поиском благодаря таким функциям, как:
- Скоринг релевантности
- Размытое совпадение
- Совпадение фраз
- Обработка синонимов
- Поддержка нескольких языков Если вы оцениваете, стоит ли оставить поиск внутри Postgres или перейти к специализированному поисковому движку, это сравнение полнотекстового поиска PostgreSQL и Elasticsearch подробно разбирает практические компромиссы.
Аналитика логов (ELK Stack)
- Сбор логов с помощью Logstash/Filebeat
- Индексация и поиск логов в Elasticsearch
- Визуализация с помощью дашбордов Kibana
- Настройка оповещений об аномалиях
Поиск для электронной коммерции
- Поиск по каталогу товаров
- Фасетная навигация с использованием агрегаций
- Автодополнение и предложения
- Персонализированные результаты поиска
Мониторинг производительности приложений
- Индексация метрик приложений
- Дашборды мониторинга в реальном времени
- Обнаружение аномалий
- Анализ трендов производительности
Полезные ссылки
Официальные ресурсы Elasticsearch
- Официальная документация Elasticsearch
- Справочник API Elasticsearch
- Руководство по Query DSL
- Клиент Elasticsearch для Python
- Клиент Elasticsearch для JavaScript
- Обзор Elastic Stack
- Настройка производительности Elasticsearch
- Управление жизненным циклом индексов
Связанные шпаргалки и руководства
- Шпаргалка по cURL — Необходима для освоения выполнения HTTP-запросов к REST API Elasticsearch
- Шпаргалка по TypeScript: Основные концепции и лучшие практики — Создайте типобезопасные приложения клиентской части Elasticsearch