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

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

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

Начать курс

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

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