Elasticsearch 客户端 for C# (.NET):NEST 和 Elastic.Clients.Elasticsearch
Elasticsearch 是一个基于 Apache Lucene 的强大分布式搜索和分析系统。为了从 C# (.NET) 应用程序中与其交互,存在多个官方和第三方客户端。在本文中,我们将详细介绍两个主要库:NEST(高级客户端)和 Elastic.Clients.Elasticsearch(Elastic 推出的新官方客户端)。您将学习如何安装、配置并使用它们进行索引、搜索和数据管理。
1. NEST — 高级客户端(推荐用于复杂项目)
NEST 是一个成熟且经过验证的客户端,它通过使用 POCO 类提供强类型 API。它自动将 JSON 序列化/反序列化为 C# 对象,并支持用于构建查询的流畅语法。
安装
dotnet add package NESTNEST 使用示例
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 = "从 .NET 使用 Elasticsearch 的详细指南", 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. 使用 lambda 语法搜索 var se