Elasticsearch 客户端 for C# (.NET):NEST 和 Elastic.Clients.Elasticsearch
Elasticsearch 是一个强大的分布式搜索和分析引擎,广泛用于全文搜索、日志记录、监控和数据分析。要从 C# (.NET) 应用程序中操作 Elasticsearch,有两个主要的官方客户端:NEST(高级客户端,提供 fluent API)和 Elastic.Clients.Elasticsearch(从 8.x 版本开始提供的新低级客户端)。在本文中,我们将详细介绍这两种方法、安装步骤、基本操作以及代码示例。
1. 什么是 .NET 的 Elasticsearch 客户端?
Elasticsearch 提供 RESTful API,但在 C# 中直接处理 HTTP 请求并不方便。官方客户端解决了这个问题:
- 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.Elasticsearch3. 连接到 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.Elasticse