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