Elasticsearch .NET 客户端演进:从 NEST 到 Elastic.Clients.Elasticsearch

了解 Elasticsearch .NET 客户端的演进以及从 NEST 到 Elastic.Clients.Elasticsearch 的过渡。

.NET 客户端和 NEST 简介

在 .NET 世界中,与 Elasticsearch 的集成长期以来一直由 `NEST` 库提供便利,该库作为开发者与 Elasticsearch 强大的搜索和分析功能交互的可靠接口。`NEST` 诞生于对 Elasticsearch 原生 .NET 客户端的需求,凭借其丰富的功能集和无缝集成能力,迅速在开发者中获得了普及。

在 Elasticsearch 第一个提交之后仅仅 8 个月,`NEST` 就忠实地跟踪 Elasticsearch 版本发布,至今已有近 14 年

从 NEST 过渡到 Elastic.Clients.Elasticsearch

随着 Elasticsearch 的发展,维护 `NEST` 复杂的代码库变得越来越困难。我们认识到需要一种更可持续的客户端开发方法,并开始从头重新设计 .NET 客户端。我们花费了近一年的时间发布了第一个 Beta 版本,又花了一年的时间才接近于支持每个服务器端点。其中最困难的决定之一是为了优先考虑可维护性而减少库的范围。

鉴于 Elasticsearch API 表面如今的规模,手动维护超过 450 个端点和近 3000 种类型(请求、响应、查询、聚合等)已不再实用。为了确保语言客户端和 Elasticsearch 之间的一致性、准确性和及时对齐,8.x 客户端以及许多相关类型现在都是从一个 共享规范 自动生成的代码。这是一种常见的解决方案,用于维护 SDK 和库(例如 Azure、AWS 和 Google Cloud Platform 的 SDK 和库)之间客户端和服务器的对齐。

Elasticsearch 规范是在 8 年多前创建的,方法是从 `NEST` 中导出类型映射,并且通过客户端团队的辛勤工作,我们现在可以使用相同的规范来创建一个新的 .NET 客户端(以及针对 Java、Go 等多种其他语言的客户端)。

随着 8.13 版本的发布,正式宣布了 `NEST` 的弃用。随着 Elasticsearch 向 `Elastic.Clients.Elasticsearch` 过渡,`NEST` 将逐渐淘汰,并在年底结束其生命周期。强烈建议开发者尽早开始迁移工作,以确保平滑过渡并最大程度地减少任何潜在的干扰。采用 `Elastic.Clients.Elasticsearch` 不仅可以确保与最新服务器功能的兼容性,还可以使应用程序免受弃用功能的影响。

Elastic.Clients.Elasticsearch:功能和更改概述

切换到 v8 客户端 `Elastic.Clients.Elasticsearch` 可以访问 Elasticsearch 8 的所有新功能,并且还为库本身带来了许多现代化改进,但也意味着与之前版本相比,便利功能有所减少。一些新的核心功能包括查询语言 `ES|QL`、现代机器学习 (ML) 功能以及以与 OpenTelemetry 兼容的活动形式改进的诊断。从 8.13 版本开始,`Elastic.Clients.Elasticsearch` 支持 Elasticsearch 8 的几乎所有服务器功能。

例如,一个重要的重大更改与聚合有关。在 `NEST` 中,流畅 API 的用法如下所示

s => s
.Aggregations(aggs => aggs
    .Children<CommitActivity>("name_of_child_agg", child => child
        .Aggregations(childAggs => childAggs
            .Average("average_per_child", avg => avg.Field(p => p.ConfidenceFactor))
            .Max("max_per_child", max => max.Field(p => p.ConfidenceFactor))
            .Min("min_per_child", min => min.Field(p => p.ConfidenceFactor))
        )
    )
)

而 v8 客户端需要以下语法

s => s
.Aggregations(aggs => aggs
	.Add("name_of_child_agg", agg => agg
		.Children(_ => {})
		.Aggregations(childAggs => childAggs
			.Add("average_per_child", agg => agg.Avg(avg => avg.Field(p => p.ConfidenceFactor)))
			.Add("max_per_child", agg => agg.Max(max => max.Field(p => p.ConfidenceFactor)))
			.Add("min_per_child", agg => agg.Min(min => min.Field(p => p.ConfidenceFactor)))
		)
	)
)

从 NEST v7 迁移到 .NET 客户端 v8

此处提供了一个全面的迁移指南:迁移指南:从 NEST v7 到 .NET 客户端 v8

其他资源

Elasticsearch 拥有大量新功能,可帮助您为您的用例构建最佳搜索解决方案。深入了解我们的 示例笔记本 以了解更多信息,开始 免费云试用,或立即在您的 本地机器 上试用 Elastic。

想要获得 Elastic 认证?了解下一期 Elasticsearch 工程师培训 什么时候开始!

准备好构建最先进的搜索体验了吗?

足够高级的搜索并非一蹴而就。Elasticsearch 由数据科学家、ML 运维工程师和许多其他同样热爱搜索的人员提供支持,他们与您一样热衷于搜索。让我们联系起来,共同努力构建神奇的搜索体验,为您带来想要的结果。

亲自试一试