【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);