Раздел 40 · Elasticsearch и ELK

REST API и формат запросов

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

С Elasticsearch не разговаривают через специальный клиент или драйвер, как с PostgreSQL. Всё общение идёт по HTTP: запрос это метод, адрес и тело JSON, ответ это код и JSON. Разберёмся в этом языке один раз, и дальше весь раздел будет на нём.

Метод, путь, тело

Любой запрос к Elasticsearch собирается из трёх частей:

  • метод HTTP: GET читает, PUT создаёт или заменяет по известному адресу, POST создаёт с автоматическим адресом или запускает действие, DELETE удаляет, HEAD проверяет существование;
  • путь: что именно. /dishes это индекс, /dishes/_doc/d634 документ, /dishes/_search поиск. Части пути с подчёркиванием, _doc, _search, _mapping, _count, это конечные точки API, действия над индексом;
  • тело в JSON: что именно найти или записать. У простого чтения его нет.

После пути можно добавить параметры: ?pretty попросит красиво отформатировать ответ, ?v добавит заголовки к табличным ответам _cat.

Запрос из терминала

Elasticsearch слушает порт 9200. Проще всего поднять его в Docker одним узлом:

docker run -d --name es -p 9200:9200 \
  -e discovery.type=single-node \
  -e xpack.security.enabled=false \
  -e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
  elasticsearch:9.5.5

xpack.security.enabled=false выключает пароли и шифрование: так можно только на своей машине. Поиск из терминала выглядит так:

curl -X GET 'http://localhost:9200/dishes/_search?pretty' \
  -H 'Content-Type: application/json' \
  -d '{ "query": { "match": { "name": "пицца" } } }'

Запрос из консоли

Писать curl с кавычками неудобно, поэтому в Kibana есть консоль Dev Tools. В ней тот же запрос записывается так:

GET /dishes/_search
{
  "query": { "match": { "name": "пицца" } }
}

Первая строка метод и путь, дальше тело. Адрес сервера и заголовки консоль подставляет сама. Запросов в одном окне может быть сколько угодно, между ними пустая строка. Ответ на каждый консоль подписывает строкой с методом, путём и кодом: # GET /dishes/_search 200 OK. В песочнице этого раздела всё устроено так же.

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.