Elasticsearch клиент для C# (.NET): NEST и Elastic.Clients.Elasticsearch
Elasticsearch — это мощная распределённая поисковая и аналитическая система на базе Apache Lucene. Для работы с ней из приложений на C# (.NET) существует несколько официальных и сторонних клиентов. В этой статье мы подробно рассмотрим две основные библиотеки: NEST (высокоуровневый клиент) и Elastic.Clients.Elasticsearch (новый официальный клиент от Elastic). Вы узнаете, как установить, настроить и использовать их для индексации, поиска и управления данными.
1. NEST — высокоуровневый клиент (рекомендуется для сложных проектов)
NEST — это старый, но проверенный клиент, который предоставляет строго типизированный API с использованием POCO-классов. Он автоматически сериализует/десериализует JSON в объекты C# и поддерживает fluent-синтаксис для построения запросов.
Установка
dotnet add package NEST
Пример использования NEST
using Nest;
using System;
// POCO-класс для документа
public class Article
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime PublishDate { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
// Настройка подключения
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.DefaultIndex("articles")
.EnableDebugMode(); // Включаем логгирование запросов
var client = new ElasticClient(settings);
// 1. Индексация документа
var article = new Article
{
Id = 1,
Title = "Elasticsearch в C#",
Content = "Подробное руководство по работе с Elasticsearch из .NET",
PublishDate = DateTime.UtcNow
};
var indexResponse = await client.IndexDocumentAsync(article);
Console.WriteLine($"Индексация: {indexResponse.IsValid}");
// 2. Поиск
var searchResponse = await client.SearchAsync<Article>(s => s
.Query(q => q
.Match(m => m
.Field(f => f.Title)
.Query("Elasticsearch")
)
)
);
foreach (var hit in searchResponse.Hits)
{
Console.WriteLine($"Найден: {hit.Source.Title}");
}
}
}
2. Elastic.Clients.Elasticsearch — новый официальный клиент
Начиная с версии 8.x, Elastic выпустила новый клиент Elastic.Clients.Elasticsearch (он же Elasticsearch.Net). Он более лёгкий, асинхронный и соответствует последним версиям Elasticsearch. В отличие от NEST, он не требует обязательного использования POCO-классов, хотя поддерживает их.
Установка
dotnet add package Elastic.Clients.Elasticsearch
Пример использования нового клиента
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
using System;
class Program
{
static async Task Main(string[] args)
{
// Настройка подключения
var settings = new ElasticsearchClientSettings(new Uri("http://localhost:9200"))
.DefaultIndex("articles");
var client = new ElasticsearchClient(settings);
// 1. Индексация с POCO
var article = new Article
{
Id = 2,
Title = "Новый клиент Elasticsearch",
Content = "Обзор возможностей Elastic.Clients.Elasticsearch",
PublishDate = DateTime.UtcNow
};
var indexResponse = await client.IndexAsync(article, idx => idx.Index("articles"));
Console.WriteLine($"Индексация: {indexResponse.IsValidResponse}");
// 2. Поиск с использованием лямбда-синтаксиса
var searchResponse = await client.SearchAsync<Article>(s => s
.Index("articles")
.Query(q => q
.Match(m => m
.Field(f => f.Title)
.Query("клиент")
)
)
);
foreach (var hit in searchResponse.Hits)
{
Console.WriteLine($"Найден: {hit.Source.Title}");
}
// 3. Поиск с низкоуровневым JSON-запросом
var rawResponse = await client.SearchAsync<Article>(s => s
.Index("articles")
.Query(q => q
.Raw("{\"match\": {\"title\": \"Elasticsearch\"}}")
)
);
// 4. Создание маппинга
var createIndexResponse = await client.Indices.CreateAsync("myindex", c => c
.Mappings(m => m
.Properties<Article>(p => p
.Keyword(t => t.Id)
.Text(t => t.Title, t => t.Analyzer("russian"))
.Text(t => t.Content)
.Date(t => t.PublishDate)
)
)
);
}
}
3. Сравнение NEST и Elastic.Clients.Elasticsearch
Также в библиотеке
Bean Validation (Jakarta Validation) — Валидация данных в Java
Redis клиент для Node.js: ioredis — полное руководство
Конфигурация приложений на Rust: библиотеки config и dotenv
Rate Limiting в PHP: полное руководство по ограничению запросов