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

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

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

Начать курс

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

Elasticsearch — это мощная распределённая поисковая и аналитическая система, построенная на базе Apache Lucene. Она позволяет выполнять полнотекстовый поиск, агрегацию данных и анализ логов в реальном времени. Для взаимодействия с Elasticsearch из приложений на Node.js существует официальный клиент — @elastic/elasticsearch. Он предоставляет удобный API для всех операций: от подключения к кластеру до сложных поисковых запросов.

Библиотека полностью поддерживает все версии Elasticsearch 7.x и 8.x, работает асинхронно на промисах и идеально подходит для построения высоконагруженных сервисов поиска, аналитики и мониторинга. В этой статье мы рассмотрим установку, базовую настройку и основные операции с данными на примере Node.js.

Установка и подключение

Установка клиента выполняется через менеджер пакетов npm:

npm install @elastic/elasticsearch

После установки необходимо создать экземпляр клиента, указав адрес сервера Elasticsearch и, при необходимости, параметры аутентификации:

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

const client = new Client({
  node: 'http://localhost:9200',
  auth: {
    username: 'elastic',
    password: 'changeme'
  }
});

Для работы с облачным сервисом Elastic Cloud используется параметр cloud.id и auth.apiKey.

Работа с индексами

Индекс в Elasticsearch — аналог базы данных в реляционных СУБД. Рассмотрим основные операции.

Создание индекса

async function createIndex() {
  const response = await client.indices.create({
    index: 'products',
    body: {
      settings: {
        number_of_shards: 1,
        number_of_replicas: 1
      },
      mappings: {
        properties: {
          title: { type: 'text' },
          description: { type: 'text' },
          price: { type: 'float' },
          created_at: { type: 'date' }
        }
      }
    }
  });
  console.log('Индекс создан:', response);
}

Удаление индекса

async function deleteIndex() {
  await client.indices.delete({ index: 'products' });
  console.log('Индекс удалён');
}

Добавление и обновление документов

Документ — основная единица данных в Elasticsearch. Добавим несколько записей в индекс products:

async function addDocuments() {
  const doc1 = {
    title: 'Ноутбук Apple MacBook Pro',
    description: 'Мощный ноутбук для разработчиков и дизайнеров',
    price: 2499.99,
    created_at: new Date()
  };

  const doc2 = {
    title: 'Клавиатура механическая Logitech',
    description: 'Беспроводная клавиатура с подсветкой',
    price: 149.99,
    created_at: new Date()
  };

  // Добавление с указанием ID
  await client.index({
    index: 'products',
    id: '1',
    body: doc1
  });

  // Добавление без ID (автоматическая генерация)
  await client.index({
    index: 'products',
    body: doc2
  });

  // Принудительная запись на диск
  await client.indices.refresh({ index: 'products' });
}

Для частичного обновления используется метод update:

await client.update({
  index: 'products',
  id: '1',
  body: {
    doc: {
      price: 2399.99
    }
  }
});

Поиск данных

Elasticsearch предоставляет мощный DSL для построения запросов. Рассмотрим несколько примеров.

Полнотекстовый поиск

async function searchProducts(query) {
  const response = await client.search({
    index: 'products',
    body: {
      query: {
        match: {
          description: query
        }
      }
    }
  });

  console.log('Найдено документов:', response.hits.total.value);
  response.hits.hits.forEach(hit => {
    console.log(`ID: ${hit._id}, Score: ${hit._score}`, hit._source);
  });
}

searchProducts('ноутбук');

Фильтрация и сортировка

const response = await client.search({
  index: 'products',
  body: {
    query: {
      bool: {
        must: [
          { match: { title: 'клавиатура' } }
        ],
        filter: [
          { range: { price: { gte: 100, lte: 200 } } }
        ]
      }
    },
    sort: [
      { price: { order: 'asc' } }
    ]
  }
});

Агрегации (группировка и статистика)

const response = await client.search({
  index: 'products',
  body: {
    size: 0, // не возвращать сами документы
    aggs: {
      avg_price: {
        avg: { field: 'price' }
      },
      price_ranges                    

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