从Nest迁移到Elasticsearch V8:如何替代DefaultMappingFor的Ignore属性
问题:Elasticsearch .NET Client v8中替代v7的DefaultMappingFor.Ignore方案
我在使用Nest(Elasticsearch .NET v7)时曾编写如下代码:
var settings = new ConnectionSettings(new Uri(elasticSettings.Uri)); settings .ThrowExceptions(elasticSettings.ThrowExceptions) .PrettyJson(elasticSettings.PrettyJson) .DefaultMappingFor<CorrelationContext>(ms => ms.Ignore(p => p.DgpHeader));
升级到Elasticsearch .NET Client v8后,将ConnectionSettings替换为ElasticsearchClientSettings,发现DefaultMappingFor上的Ignore选项不再可用。我找不到v8版本的相关文档,请问该选项是否被移至别处?若没有,如何实现相同的忽略属性效果?
补充说明:我无法修改CorrelationContext类的代码添加JsonIgnore特性(该类位于其他程序集)。
解决方案
在Elasticsearch .NET Client v8中,DefaultMappingFor的配置逻辑发生了调整,原v7中的Ignore方法被整合到属性映射的配置链中。你可以通过以下两种方式实现忽略指定属性的需求:
1. 针对目标类型配置属性忽略
通过DefaultMappingFor的Properties方法,在对应属性的配置中调用Ignore(true):
var settings = new ElasticsearchClientSettings(new Uri(elasticSettings.Uri)) .ThrowExceptions(elasticSettings.ThrowExceptions) .PrettyJson(elasticSettings.PrettyJson) .DefaultMappingFor<CorrelationContext>(ms => ms .Properties(props => props .Text(p => p .Name(n => n.DgpHeader) .Ignore(true) ) ) );
注意:这里的Text对应属性的字段类型,如果DgpHeader是其他类型(如Keyword),替换为对应的类型方法即可。
2. 通过全局序列化配置实现忽略
如果需要更通用的配置方式,或者不确定属性的具体类型,可以通过自定义序列化器的契约解析逻辑来实现。以默认的System.Text.Json序列化为例:
var settings = new ElasticsearchClientSettings(new Uri(elasticSettings.Uri)) .ThrowExceptions(elasticSettings.ThrowExceptions) .PrettyJson(elasticSettings.PrettyJson) .SourceSerializer(_ => new JsonSerializerOptions { TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { if (typeInfo.Type == typeof(CorrelationContext)) { var targetProp = typeInfo.Properties.FirstOrDefault(p => p.Name == nameof(CorrelationContext.DgpHeader)); if (targetProp != null) { targetProp.Ignore = true; } } } } } });
如果项目使用Newtonsoft.Json作为序列化器,可通过自定义ContractResolver来标记目标属性为忽略状态,逻辑与上述一致。
内容的提问来源于stack exchange,提问作者Koen
相关产品推荐
相关产品推荐

