🔎 Elasticsearch

Индексы, документы, поиск, агрегации, маппинги и REST-запросы.

Шпаргалки · Инфраструктура · #elasticsearch #elk #search

Понятия

Термин Аналог в БД
Index таблица
Document строка (JSON)
Field колонка
Mapping схема полей
Shard / Replica часть индекса / копия

REST-запросы (Kibana Dev Tools)

GET /                                    # состояние узла
GET _cat/indices?v
PUT /products                            # создать индекс
POST /products/_doc/1                    # добавить документ
{ "name": "Ноутбук", "price": 999, "tags": ["tech"] }
GET /products/_doc/1
POST /products/_update/1
{ "doc": { "price": 899 } }
DELETE /products/_doc/1
DELETE /products

Поиск

GET /products/_search
{
  "query": {
    "bool": {
      "must":   [ { "match": { "name": "ноутбук" } } ],
      "filter": [ { "range": { "price": { "lte": 1000 } } },
                  { "term":  { "tags": "tech" } } ]
    }
  },
  "sort": [ { "price": "asc" } ],
  "from": 0, "size": 10,
  "_source": ["name", "price"]
}

must участвует в релевантности, filter только отбирает (быстрее, кэшируется).

Основные запросы

Запрос Назначение
match полнотекстовый поиск
match_phrase точная фраза
term / terms точное значение (для keyword)
range диапазон
exists поле присутствует
wildcard, prefix по маске
multi_match по нескольким полям

Агрегации

GET /products/_search
{ "size": 0,
  "aggs": {
    "by_tag": { "terms": { "field": "tags" } },
    "avg_price": { "avg": { "field": "price" } }
  } }

Маппинг

PUT /logs
{ "mappings": { "properties": {
    "@timestamp": { "type": "date" },
    "level":   { "type": "keyword" },
    "message": { "type": "text" } } } }

text анализируется для поиска, keyword хранится целиком (фильтры, агрегации).

Приёмы

  • _bulk для массовой загрузки.
  • Шаблоны индексов и ILM управляют жизненным циклом логов (hot → warm → delete).
  • Не используйте from + size для глубокой пагинации: search_after.