标签:Elasticsearch

Elasticsearch.Nest 教程系列 2-2 连接:Connection pools | 连接池使用


连接池是一个内部机制,它主要关注于集群中注册的节点以及判断 NEST 可以使用那些节点来发送客户端的请求。

  • P.S.:此连接池非彼连接池(跟ADO.NET 中的数据库连接池不同),NEST 的连接池并不负责管理跟 ES 服务器的 TCP 连接。
    • 到 ES 服务端的 TCP 连接由 DESKTOP CLR 中的 ServicePointManager 负责,更多关于 ServicePointManager 见此

ES 中的连接池的作用:负责管理 ES 集群中可以建立连接的节点,并且一个 IConnectionPool 示例与一个 ConnectionSetting 示例相关联(一一对应关联)。

由于单个 NEST 客户端建议使用’单例’,因此单个连接池实例的生命周期跟应用程序的生命周期相同。

一共包含以下 5 个类型的连接池

  • SingleNodeConnectionPool
  • CloudConnectionPool
  • StaticConnectionPool
  • SniffingConnectionPool
  • StickyConnectionPool

SingleNodeConnectionPool

一般 SingleNodeConnectionPool 适用于集群中只有一个节点或者只有单个复杂均衡实例的情况。

当没有在 ConnectionSettings 构造函数中显式指定连接池类型的时候,此类型是默认连接池,也是在所有类型中最简单的一种连接池类型。

Elasticsearch.Nest 教程系列 2-3 连接:Modifying the default connection | 修改默认连接


NEST 客户端通过 IConnection 发送请求并创建响应,默认实现使用 System.Net.Http.HttpClient。

有的时候,你希望客制化连接,此时可以通过 InMemoryConnection,HttpConnection 来自定义。

使用 InMemoryConnection

InMemoryConnection 是一个内置的 IConnection,可以轻松地对其编写单元测试。通过配置,可以将调用时的默认响应字节、HTTP 状态代码和异常处理进行客制化。

事实上,InMemoryConnection 并不会发送任何请求或接收来自E lasticsearch 的任何响应:如果将 .DisableDirectStreaming 在全局或请求的时候设置为 true,则此请求仍会序列化,并且可以在响应上获取请求字节。

var connection = new InMemoryConnection();
var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
/*
    1.通过 IConnectionPool 和 IConnection 重载创建一个 ConnectionSettings
    2.connection 使用的是 InMemoryConnection 的无参构造函数,表示为所有相应内容返回 200 状态码,并不真实执行任何 IO 操作。
*/
var settings = new ConnectionSettings(connectionPool, connection);
var client = new ElasticClient(settings);

Elasticsearch.Nest 教程系列 9-1 转换:Index name inference | 索引名推断的3种方式


NEST 提供了多种方式来推断索引名,不同方式可以同时指定,但相互之间存在优先级关系,具体如下:

示例

配置类:

public class ElasticSearchSettings
{
    public string ServerUri { get; set; }
    public string DefaultIndex { get; set; } = "defaultindex";
}

Elasticsearch.Nest 教程系列 2-1 连接:Configuration options | 配置选项


NEST 默认情况下使用预设的值与 ElasticSearch 集群进行交互,并提供了许多配置选项和组件来修改默认值(行为)。

你可以修改 ConnectionConfiguration 和 ConnectionStrings 的属性以达到修改默认连接行为的效果:

  • ConnectionConfiguration:面向 ElasticSearch.Net。
  • ConnectionStrings:面向 NEST。

配置 ConnectionConfiguration

因为 ConnectionStrings 继承自 ConnectionConfiguration,所以以下选项(方法/属性)适用于 ConnectionConfiguration 和 ConnectionStrings。

  • ApiKeyAuthentication: 与所有请求一起发送到Elasticsearch的 Api Key。
  • BasicAuthentication: 与所有请求一起发送到Elasticsearch的 基本身份验证凭证。
  • ClientCertificate: 为所有 HTTP 请求使用 X509Certificate 认证。你也可以在每一个请求上通过 ClientCertificates 属性来进行设置。

Elasticsearch.Nest 教程系列 1:Nest 快速入门


Elasticsearch.Net 和 NEST 对比说明:

  • Elasticsearch 官方为 .NET 提供了 2 个官方客户端库:Elasticsearch.Net 和 NEST。
  • 可以简单理解为 Elasticsearch.Net 是 NEST 的一个子集。
  • NEST 内部使用了 ElasticSearch.Net ,并通过 NEST 可以对外暴露 ElasticSearch.Net 客户端。
  • 但 NEST 包含了 ElasticSearch.Net 所没有的一些高级功能,如:
    • 强类型查询 DSL:可以将所有请求和响应的对象类型转换 1:1 的.NET 类型。
    • 自动转换为 CLR 的数据类型。

基本上 .NET 项目到了要使用上 ElasticSearch 的地步,直接选择 NEST 即可。

在使用 NEST 作为客户端的时候,建议将 ElasticClient 对象作为单例来使用。

  • ElasticClient 被设计为线程安全。
  • ES 中的缓存是根据 ConnectionSettings 来划分的,即服务端缓存针对的是每一个 ConnectionStrings
  • 例外: 当你需要连接不同的 ES 集群的时候,就不要用单例了,应为不同的 ElasticClient 使用不同的 ConnectionStrings。

快速使用

  • 使用 Nest 的时候约定 Nest 版本需要跟 ElasticSearch 版本保持一致,即服务端 ES版本为 7.3.1,则 Nest 版本也要使用 7.3.1
  • 以下示例通过 IoC 进行注入(单例),你也可以直接通过单例模式来实现。