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-сжатия для уменьшения трафика.
- Кастомные