Nest.ConnectionSettings.SetJsonSerializerSettingsModifier 有效吗?
Does Nest.ConnectionSettings.SetJsonSerializerSettingsModifier even work?
这是我的问题。由于项目需要,我们必须将我们的日期以相同的格式保存在 elasticsearch 索引中。我们尝试的是下一种方式 -
var connectionPool = new SniffingConnectionPool(nodeList);
var connectionSettings = new ConnectionSettings(connectionPool)
.SetJsonSerializerSettingsModifier(
m => m.DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffK")
// other configuration goes here
但是没有成功。通过 ES 索引搜索,我看到了尾随零被删除的日期(例如 2015-05-05T18:55:27Z insted 预期的 2015-05-05T18:55:27.0000000Z)。下一个选项也没有帮助:
var connectionPool = new SniffingConnectionPool(nodeList);
var connectionSettings = new ConnectionSettings(connectionPool)
.SetJsonSerializerSettingsModifier(m =>
{
m.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK"});
})
// other configuration goes here
在 运行 时间深入研究 ElasticClient,我发现最终有一个合同解析器似乎覆盖了所有这些设置:
public class ElasticContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
JsonContract contract = base.CreateContract(objectType);
...
if (objectType == typeof(DateTime) || objectType == typeof(DateTime?))
contract.Converter = new IsoDateTimeConverter();
...
if (this.ConnectionSettings.ContractConverters.HasAny())
{
foreach (var c in this.ConnectionSettings.ContractConverters)
{
var converter = c(objectType);
if (converter == null)
continue;
contract.Converter = converter;
break;
}
}
return contract;
}
}
因此,如果我做对了,没有明确指定转换器(通过连接 Settings.AddContractJsonConverters()),我的 json 设置将会消失,因为IsoDateTimeConverter 使用默认设置实例化,而不是我通过 SetJsonSerializerSettingsModifier.
有人 运行 解决过这个问题吗?或者我只是错过了什么?提前致谢!
这是我根据需要处理自定义日期格式的方式:
public class Document
{
[ElasticProperty(DateFormat = "yyyy-MM-dd", Type = FieldType.Date)]
public string CreatedDate { get; set; }
}
client.Index(new Document {CreatedDate = DateTime.Now.ToString("yyyy-MM-dd")});
我在 ES 中的文档
{
"_index": "indexname",
"_type": "document",
"_id": "AU04kd4jnBKFIw7rP3gX",
"_score": 1,
"_source": {
"createdDate": "2015-05-09"
}
}
希望对您有所帮助。
这是我的问题。由于项目需要,我们必须将我们的日期以相同的格式保存在 elasticsearch 索引中。我们尝试的是下一种方式 -
var connectionPool = new SniffingConnectionPool(nodeList);
var connectionSettings = new ConnectionSettings(connectionPool)
.SetJsonSerializerSettingsModifier(
m => m.DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffK")
// other configuration goes here
但是没有成功。通过 ES 索引搜索,我看到了尾随零被删除的日期(例如 2015-05-05T18:55:27Z insted 预期的 2015-05-05T18:55:27.0000000Z)。下一个选项也没有帮助:
var connectionPool = new SniffingConnectionPool(nodeList);
var connectionSettings = new ConnectionSettings(connectionPool)
.SetJsonSerializerSettingsModifier(m =>
{
m.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK"});
})
// other configuration goes here
在 运行 时间深入研究 ElasticClient,我发现最终有一个合同解析器似乎覆盖了所有这些设置:
public class ElasticContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
JsonContract contract = base.CreateContract(objectType);
...
if (objectType == typeof(DateTime) || objectType == typeof(DateTime?))
contract.Converter = new IsoDateTimeConverter();
...
if (this.ConnectionSettings.ContractConverters.HasAny())
{
foreach (var c in this.ConnectionSettings.ContractConverters)
{
var converter = c(objectType);
if (converter == null)
continue;
contract.Converter = converter;
break;
}
}
return contract;
}
}
因此,如果我做对了,没有明确指定转换器(通过连接 Settings.AddContractJsonConverters()),我的 json 设置将会消失,因为IsoDateTimeConverter 使用默认设置实例化,而不是我通过 SetJsonSerializerSettingsModifier.
有人 运行 解决过这个问题吗?或者我只是错过了什么?提前致谢!
这是我根据需要处理自定义日期格式的方式:
public class Document
{
[ElasticProperty(DateFormat = "yyyy-MM-dd", Type = FieldType.Date)]
public string CreatedDate { get; set; }
}
client.Index(new Document {CreatedDate = DateTime.Now.ToString("yyyy-MM-dd")});
我在 ES 中的文档
{
"_index": "indexname",
"_type": "document",
"_id": "AU04kd4jnBKFIw7rP3gX",
"_score": 1,
"_source": {
"createdDate": "2015-05-09"
}
}
希望对您有所帮助。