Elasticsearch клиент для C# (.NET): NEST и Elastic.Clients.Elasticsearch
Elasticsearch — это мощная распределённая поисковая и аналитическая система, которая широко используется для полнотекстового поиска, логирования, мониторинга и анализа данных. Для работы с Elasticsearch из приложений на C# (.NET) существуют два основных официальных клиента: NEST (высокоуровневый, с fluent API) и Elastic.Clients.Elasticsearch (новый, низкоуровневый, появившийся с версии 8.x). В этой статье мы подробно рассмотрим оба подхода, установку, базовые операции и примеры кода.
1. Что такое Elasticsearch клиент для .NET?
Elasticsearch предоставляет RESTful API, но напрямую работать с HTTP-запросами в C# неудобно. Официальные клиенты решают эту проблему:
- NEST — старый, но надёжный высокоуровневый клиент. Предоставляет строго типизированные запросы, маппинг POCO-классов и fluent-интерфейс. Рекомендуется для проектов на .NET Framework и .NET Core 3.1.
- Elastic.Clients.Elasticsearch — новый клиент (начиная с Elasticsearch 8.x). Легковесный, асинхронный, с поддержкой .NET 6+. Использует System.Text.Json и не требует дополнительных зависимостей.
2. Установка библиотек
Установка выполняется через NuGet. Для NEST:
dotnet add package NEST
Для нового клиента:
dotnet add package Elastic.Clients.Elasticsearch
3. Подключение к Elasticsearch
Пример подключения с помощью NEST:
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.DefaultIndex("my_index");
var client = new ElasticClient(settings);
Пример подключения с помощью Elastic.Clients.Elasticsearch:
var settings = new ElasticsearchClientSettings(new Uri("http://localhost:9200"));
var client = new ElasticsearchClient(settings);
4. Определение модели данных
Для работы с документами создадим POCO-класс:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public DateTime CreatedAt { get; set; }
}
5. CRUD-операции (создание, чтение, обновление, удаление)
5.1. Индексация документа (создание/обновление)
NEST:
var product = new Product { Id = 1, Name = "Ноутбук", Price = 75000 };
var response = await client.IndexAsync(product, idx => idx.Index("products"));
Elastic.Clients.Elasticsearch:
var product = new Product { Id = 1, Name = "Ноутбук", Price = 75000 };
var response = await client.IndexAsync(product, "products", 1);
5.2. Получение документа по ID
NEST:
var response = await client.GetAsync<Product>(1, g => g.Index("products"));
var product = response.Source;
Elastic.Clients.Elasticsearch:
var response = await client.GetAsync<Product>("products", 1);
var product = response.Source;
5.3. Обновление документа
NEST:
var response = await client.UpdateAsync<Product>(1, u => u
.Index("products")
.Doc(new Product { Name = "Ноутбук HP", Price = 80000 }));
Elastic.Clients.Elasticsearch:
var response = await client.UpdateAsync<Product>("products", 1, u => u
.Doc(new Product { Name = "Ноутбук HP", Price = 80000 }));
5.4. Удаление документа
NEST:
var response = await client.DeleteAsync<Product>(1, d => d.Index("products"));
Elastic.Clients.Elasticsearch:
var response = await client.DeleteAsync("products", 1);
6. Поиск и запросы
Оба клиента поддерживают мощный DSL для построения запросов.
6.1. Простой поиск по полю (match)
NEST:
Также в библиотеке
ORM для Go (Golang): сравнение и примеры популярных библиотек
HTTP-клиент для Go (Golang): топ библиотек для работы с HTTP
OpenAI SDK для JavaScript (Node.js): полное руководство с примерами
JWT токены в TypeScript: полное руководство по работе с JSON Web Tokens
Работа с изображениями в Go (Golang): image, draw, imaging, resize