【ElasticSearch Nest】ConnectionSettings(配置)

ConnectionSettings

  • DefaultFieldNameInferrer: 指定如何从 CLR 属性名推断字段名称。默认情况下,NEST 使用 camel 命名方式,如在 CLR 中声明的属性名为 EmailAddress,将会被推断为 emailAddress 作为 ES 文档的字段名。
var settings = new ConnectionSettings(node).DefaultFieldNameInferrer((name) => name);//不使用camel命名,字段名与model字段同名
  • DefaultIndex: 默认索引名称,当没有显式指定索引名的时候,就会用默认索引名。
  • DefaultMappingFor: 指定如何映射 ES 文档字段和 CLR 的属性。映射关系可以推断给定的 index,id 和 相关 name 以及控制序列化 CLR 属性的行为。
  • ApiKeyAuthentication: 与所有请求一起发送到Elasticsearch的 Api Key。
  • BasicAuthentication: 与所有请求一起发送到Elasticsearch的 基本身份验证凭证。
    //验证 未开启
    //settings.BasicAuthentication("username", "password");
  • ClientCertificate: 为所有 HTTP 请求使用 X509Certificate 认证。你也可以在每一个请求上通过 ClientCertificates 属性来进行设置。
   //验证证书
    //settings.ClientCertificate("");
    //settings.ClientCertificates(new X509CertificateCollection());
    //settings.ServerCertificateValidationCallback();
  • ConnectionLimit: 限制并发连接数。
    • 对于非 System.Net.Http.CurlHandler 连接,默认 80。
    • 对于 System.Net.Http.CurlHandler,取决于 CPU 数量。
    • 对于非 CORE CLR,该设置应用于创建 ServicePoint 对象时的 ServicePointManager 对象的 DefaultLConnectionLimit 属性,这会影响默认的 IConnection 实现。
    • 对于 CORE CLR,该设置应用于实现了 IConnection 接口且内部使用了 HttpClientHandler 实例的 MaxConnectionsPerServer 属性的 HttpClient 上。
  • DeadTimeout: 超时失效时间,用于设置节点被标记为失效的默认失效超时因子。一些连接池可能使用固定的超时时间,而另外的一些则使用此超时时间因子并以指数方式增加。
  • DisableAutomaticProxyDetection: 禁用自动检测代理。
  • DisableDirectStreaming: 确保响应字节在ElasticsearchResponse 上始终可用,默认为 false。
    • 依赖于注册的序列化器,该选项会将响应数据先缓存在内存中,存在潜在的性能影响,生产环境不建议使用(置为false)。
  • DisablePing: 是否禁用 ping。
  • EnableDebugMode: 是否启用调试模式。将该选项设置为 true 有助于调试,例如 DisableDirectStreaming() 和 PrettyJson() 以便可以检查原始请求和响应的 JSON 字符串。另外开启该选项后会向服务器获取有错误的完整堆栈信息。
  • EnableHttpCompression: 是否在请求和响应的时候启用 http gzip 压缩传输。
    • 若要启用该选项的话,需要在 ElasticSearch 服务上也启用该选项。启用方式见此。
  • EnableHttpPipelining: 是否启用 HTTP Pipeline。
    • 同样的,若要启用该选项的话,需要在 ElasticSearch 服务上也启用 http pipeline 选项。
  • EnableTcpKeepAlive: 是否启用 TCP 保持。
    • 部署在 windows 上的话,需要设置 ServicePointManager.SetTcpKeepAlive。
  • GlobalHeaders: 设置全局的请求头信息。
    • 如自定义的“认证”请求头信息。
  • GlobalQueryStringParameters: 设置全局的查询字符串信息。
    • 如若每次都要传输的 ApiKey。
  • IncludeServerStackTraceOnError: 默认 false,强制所有请求都附加“?error_trace=true”查询参数。这会导致 ES 服务发生错误时返回堆栈信息。
  • MaxDeadTimeout: 将节点标记为失效的最长时间。不同的 IConnectionPool 实现可以选择不同的默认值。
  • MaximumRetries: 请求的最大重试次数。
  • MaxRetryTimeout: 最大重试超时时间:限定总的运行时间,包括重试,与 RequestTimeout 分开,当不设置的时候,默认值为 RequestTimeout 设定的值(RequestTimeout 默认为 60s)。
  • RequestTimeout: 用于设定每个请求的超时时间,默认 60s。
    • 你可以将这个值设大一点,然后再 ES 服务端设置请求的超时时间。
  • NodePredicate: 注册一个谓词以选择在哪个节点上执行 API 调用。需要注意的时 Sniffing 相关的嗅探请求会忽略该谓词,并始终在所有节点上执行。
    //选择节点
    settings.NodePredicate(node =>
    {
        if (node.Name == "node1")
        {
            return true;
        }
    });
- 当使用了支持 嗅探节点 的 IConnectionPool 实现的时候,默认会忽略”仅主节点“可用的常规 API 调用。
- 当使用静态或单节点连接池时,会将你实例化的客户端节点原封不动的进行返回。

OnRequestCompleted: ,Action,请求完成事件,当从 ES 服务端接收到响应的时候会触发。该事件适用于记录日志。多个回调的话可以注册多次。
OnRequestDataCreated: Action,当请求数据创建完成的时候会被触发。多个回调的话可以注册多次。

        settings.OnRequestDataCreated(requestData =>
        {
            //请求的数据创建完成 返回请求的数据
            //requestData.Headers.Add("Accept", "application/json");
            var url = requestData.Uri;
            var postData = requestData.PostData;
        });

PingTimeout: 设定默认的 ping 超时时间,可用来检测节点是否还存活着。
PrettyJson: 强制在所有的请求连接上附加”?pretty=true“请求参数,会返回格式化后的 JSON。同样的,会强制客户端发送格式化的 JSON。默认 false。
Proxy: 如果你的连接需要经过代理的话,可以用此选项来指定代理代理的 url。
ServerCertificateValidationCallback: 服务端证书验证回调事件,每一个终结点都会调用该事件直到返回 true。一旦返回了 true,则在该主机的 ServiceEndpoint 生命周期内,该终结点都是被验证过的。

    var settings = new ConnectionSettings(new Uri("https://127.0.0.1:9200/")).DefaultIndex("meshopindexname2")
     .ServerCertificateValidationCallback((o, certificate, chain, errors) => true)
     .ServerCertificateValidationCallback(CertificateValidations.AllowAll); 

SkipDeserializationForStatusCodes: 配置特定的状态码跳过反序列化,当你通过代理访问 ES,返回 401,500 状态码的时候,就可以跳过反序列化。
SniffLifeSpan: 用于设置嗅探的持续时间戳。在设置的持续时间之前,集群状态被认为是 stale(过期的,不复存在的),应再次执行嗅探。
IConnectionPool 必须发信号来表示它支持被重新广播,否则,嗅探将永不会被执行。
默认时间是 1小时,设置为 null 可以完全禁用该功能。
嗅探只会发生在对 SuppotsReseeding 返回 true 的 ConnectionPools 上。

  • SniffOnConnectionFault: 如果连接池支持嗅探,则该配置用于设置是否允许当调用失败时,重新嗅探集群。默认为 true。

  • SniffOnStartup: 如果连接池支持 reseeding,则在第一次使用连接池时进行嗅探嗅探,默认为 true。

  • ThrowExceptions: 跟 C/GO 在响应时的错误检查不同。调用请求的时候,如果在客户端或 ES 服务器上发生了异常,那么客户端在调用 IsValid 的时候会抛出一个异常(除非 SuccessOrKnownError 被设置为 false)。

    • 出现此类错误的原因可能是搜索解析器错误,索引丢失异常等等。
  • TransferEncodingChunked: 是否应该使用分块传输编码发送请求,默认为 false。

  • UserAgent: 与请求一起发送的用户代理字符串,对调试很有用,有助于弄清初始化请求 ES 服务器时的客户端和框架版本。

  • DefaultDisableIdInference: 禁用给定 CLR 类型的自动 ID 推断。NEST 默认会将命名为 Id 的属性作为 ES 中的 _id 发送给 ES。

连接池

SingleNodeConnectionPool

一般 SingleNodeConnectionPool 适用于集群中只有一个节点或者只有单个复杂均衡实例的情况。
SingleNodeConnectionPool 不会标记节点是否还存活,也跟 sniffing 和 pinging 行为没有关系。该连接池会确保该 URI 下的连接随时可用。

    var pool = new SingleNodeConnectionPool(new Uri(_esSettings.ServerUri));
    var settings = new ConnectionSettings(pool);
    settings.DefaultIndex(esSettings.DefaultIndex);
    settings.DefaultMappingFor<User>(usr => usr.IndexName("users"));
    _client = new ElasticClient(settings);

同上:

//内部实际使用的是 SingleNodeConnectionPool 连接池。
var client = new ElasticClient(uri);

StaticConnectionPool

如果您有一个小型集群且不想启用嗅探功能来发现集群拓扑的话,则使用 StaticConnectionPool 连接池非常适合。

// 给定一个 Uri 集合
var uris = Enumerable.Range(9200, 5)
    .Select(port => new Uri($"http://localhost:{port}"));

// 让连接池使用这些 URI
var pool = new StaticConnectionPool(uris);
var client = new ElasticClient(new ConnectionSettings(pool));

// 也可以使用 Node 集合来进行实例化
var nodes = uris.Select(u => new Node(u));
pool = new StaticConnectionPool(nodes);
client = new ElasticClient(new ConnectionSettings(pool));

CloudConnectionPool

CloudConnectionPool 适用于使用了 Elatic 云服务实例的连接。。

var credentials = new BasicAuthenticationCredentials("username", "password"); 
var pool = new CloudConnectionPool(cloudId, credentials); 
var client = new ElasticClient(new ConnectionSettings(pool));

SniffingConnectionPool

            //可动态嗅探集群 ,随机请求 支持嗅探、ping
            //IConnectionPool pool = new SniffingConnectionPool(nodes);

StickyConnectionPool

            //选择一个可用节点作为请求主节点,支持ping 支持嗅探
            //IConnectionPool pool=new StickySniffingConnectionPool(nodes);
posted @ 2022-05-31 00:25  .Neterr  阅读(569)  评论(0编辑  收藏  举报