Cliente Elasticsearch para C# (.NET): NEST y Elastic.Clients.Elasticsearch

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cliente Elasticsearch para C# (.NET): NEST y Elastic.Clients.Elasticsearch

\n\n

Elasticsearch es un potente sistema distribuido de búsqueda y análisis que se utiliza ampliamente para búsqueda de texto completo, registro de eventos, monitoreo y análisis de datos. Para trabajar con Elasticsearch desde aplicaciones en C# (.NET), existen dos clientes oficiales principales: NEST (de alto nivel, con fluent API) y Elastic.Clients.Elasticsearch (nuevo, de bajo nivel, disponible desde la versión 8.x). En este artículo, analizaremos en detalle ambos enfoques, la instalación, las operaciones básicas y ejemplos de código.

\n\n

1. ¿Qué es un cliente Elasticsearch para .NET?

\n\n

Elasticsearch proporciona una API RESTful, pero trabajar directamente con solicitudes HTTP en C# no es práctico. Los clientes oficiales resuelven este problema:

\n
    \n
  • NEST — un cliente de alto nivel antiguo pero confiable. Proporciona consultas fuertemente tipadas, mapeo de clases POCO e interfaz fluent. Recomendado para proyectos en .NET Framework y .NET Core 3.1.
  • \n
  • Elastic.Clients.Elasticsearch — un nuevo cliente (a partir de Elasticsearch 8.x). Ligero, asíncrono, con soporte para .NET 6+. Utiliza System.Text.Json y no requiere dependencias adicionales.
  • \n
\n\n

2. Instalación de las librerías

\n\n

La instalación se realiza a través de NuGet. Para NEST:

\n
dotnet add package NEST
\n

Para el nuevo cliente:

\n
dotnet add package Elastic.Clients.Elasticsearch
\n\n

3. Conexión a Elasticsearch

\n\n

Ejemplo de conexión usando NEST:

\n
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))\n    .DefaultIndex("my_index");\nvar client = new ElasticClient(settings);
\n\n

Ejemplo de conexión usando Elastic.Clients.Elasticsearch:

\n
var settings = new ElasticsearchClientSettings(new Uri("http://localhost:9200"));\nvar client = new ElasticsearchClient(settings);
\n\n

4. Definición del modelo de datos

\n\n

Para trabajar con documentos, crearemos una clase POCO:

\n
public class Product\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n    public string Description { get; set; }\n    public decimal Price { get; set; }\n    public DateTime CreatedAt { get; set; }\n}
\n\n

5. Operaciones CRUD (crear, leer, actualizar, eliminar)

\n\n

5.1. Indexación de documento (crear/actualizar)

\n

NEST:

\n
var product = new Product { Id = 1, Name = "Portátil", Price = 75000 };\nvar response = await client.IndexAsync(product, idx => idx.Index("products"));
\n\n

Elastic.Clients.Elasticsearch:

\n
var product = new Product { Id = 1, Name = "Portátil", Price = 75000 };\nvar response = await client.IndexAsync(product, "products", 1);
\n\n

5.2. Obtener documento por ID

\n

NEST:

\n
var response = await client.GetAsync<Product>(1, g => g.Index("products"));\nvar product = response.Source;
\n\n

Elastic.Clients.Elasticsearch:

\n
var response = await client.GetAsync<Product>("products", 1);\nvar product = response.Source;
\n\n

5.3. Actualizar documento

\n

NEST:

\n
var response = await client.UpdateAsync<Product>(1, u => u\n    .Index("products")\n    .Doc(new Product { Name = "Portátil HP", Price = 80000 }));
\n\n

Elastic.Clients.Elasticsearch:

\n
var response = await client.UpdateAsync<Product>("products", 1, u => u\n    .Doc(new Product { Name = "Portátil HP", Price = 80000 }));
\n\n

5.4. Eliminar documento

\n

NEST:

\n
var response = await client.DeleteAsync<Product>(1, d => d.Index("products"));
\n\n

Elastic.Clients.Elasticse

Recommendations