Elasticsearch клиент для C# (.NET): NEST и Elastic.Clients.Elasticsearch

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

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

Начать курс

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:

                    

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