Elasticsearch клиент для Node.js: @elastic/elasticsearch

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Elasticsearch клиент для Node.js (@elastic/elasticsearch)

Библиотека @elastic/elasticsearch — это официальный, высокопроизводительный HTTP-клиент для взаимодействия с Elasticsearch из среды Node.js. Она предоставляет удобный API для выполнения всех операций: от простой индексации документов до сложных поисковых запросов и агрегаций. Библиотека полностью поддерживает все версии Elasticsearch 7.x и 8.x, включая работу с кластерами, аутентификацию и сжатие данных.

Установка

Для установки используйте npm или yarn:

npm install @elastic/elasticsearch
# или
yarn add @elastic/elasticsearch

Базовое подключение

Создайте экземпляр клиента, указав адрес сервера Elasticsearch. Для версии 8.x требуется настройка TLS и API-ключа или логина/пароля.

const { Client } = require('@elastic/elasticsearch');

// Подключение к локальному серверу (Elasticsearch 7.x)
const client = new Client({ node: 'http://localhost:9200' });

// Подключение к облачному серверу Elastic Cloud (8.x)
const cloudClient = new Client({
  cloud: { id: 'my-cloud-id' },
  auth: { apiKey: 'base64EncodedApiKey' }
});

Основные операции

1. Индексация (добавление) документа

Метод index добавляет или заменяет документ в указанном индексе.

async function indexDocument() {
  const result = await client.index({
    index: 'articles',
    id: '1',
    body: {
      title: 'Elasticsearch клиент для Node.js',
      content: 'Подробное описание библиотеки...',
      tags: ['elasticsearch', 'node.js'],
      published: true,
      views: 150
    }
  });
  console.log('Документ проиндексирован:', result.result);
}
indexDocument();

2. Поиск документов

Метод search выполняет полнотекстовый поиск с использованием Query DSL.

async function searchDocuments() {
  const { body } = await client.search({
    index: 'articles',
    body: {
      query: {
        bool: {
          must: [
            { match: { title: 'Elasticsearch' } },
            { term: { published: true } }
          ],
          filter: [
            { range: { views: { gte: 100 } } }
          ]
        }
      }
    }
  });

  console.log('Найдено документов:', body.hits.total.value);
  body.hits.hits.forEach(hit => {
    console.log(`- ${hit._source.title} (релевантность: ${hit._score})`);
  });
}
searchDocuments();

3. Получение документа по ID

async function getDocument() {
  try {
    const { body } = await client.get({
      index: 'articles',
      id: '1'
    });
    console.log('Документ:', body._source);
  } catch (error) {
    if (error.meta.statusCode === 404) {
      console.log('Документ не найден');
    } else {
      console.error('Ошибка:', error);
    }
  }
}
getDocument();

4. Обновление документа (частичное)

async function updateDocument() {
  const { body } = await client.update({
    index: 'articles',
    id: '1',
    body: {
      doc: {
        views: 151,
        updated_at: new Date().toISOString()
      }
    }
  });
  console.log('Документ обновлён, версия:', body._version);
}
updateDocument();

5. Удаление документа

async function deleteDocument() {
  const { body } = await client.delete({
    index: 'articles',
    id: '1'
  });
  console.log('Результат удаления:', body.result);
}
deleteDocument();

Работа с агрегациями

Агрегации позволяют получать статистические данные по результатам поиска.

async function aggregateByTags() {
  const { body } = await client.search({
    index: 'articles',
    body: {
      size: 0, // не возвращать сами документы
      aggs: {
        popular_tags: {
          terms: { field: 'tags.keyword', size: 10 }
        },
        avg_views: {
          avg: { field: 'views' }
        }
      }
    }
  });

  console.log('Популярные теги:');
  body.aggregations.popular_tags.buckets.forEach(bucket => {
    console.log(`  ${bucket.key}: ${bucket.doc_count} статей`);
  });
  console.log(`Среднее количество просмотров: ${body.aggregations.avg_views.value.toFixed(2)}`);
}
aggregateByTags();

Продвинутые возможности

  • Пул соединений — автоматическое управление несколькими узлами Elasticsearch, балансировка нагрузки и повторные попытки при сбоях.
  • Сжатие запросов/ответов — включение gzip-сжатия для уменьшения трафика.
  • Кастомные

Рекомендаций