elasticsearch.net 和 Nest (C#) 中的日期格式问题
Problems with Date format in elasticsearch.net and Nest (C#)
我有以下 C# 模型:
[ElasticType(Name = "myType")]
public class MyType
{
...
[ElasticProperty(Name = "ElasticId")]
[DataMember(Name = "ElasticId")]
public string ElasticId { get; set; }
...
[ElasticProperty(Name = "DateToBeUsed", Type = FieldType.Date, DateFormat = "date_hour_minute_second_millis")]
public string DateToBeUsed { get; set; }
...
}
"date_hour_minute_second_millis"对应格式如下:yyyy-MM-dd'T'HH:mm:ss.SSS
(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-date-format.html)
映射 ES 是使用 Nest 使用 "map" 方法完成的,对应于:
"mappings": {
"myType": {
"properties": {
...,
"ElasticId": {
"type": "string"
},
...,
"DateToBeUsed": {
"type": "date",
"format": "date_hour_minute_second_millis"
},
...
}
}
}
我在此索引中插入一个文档:
"_source": {
...,
"ElasticId": "2",
...,
"DateToBeUsed": "2012-05-21T09:51:34.073",
...
}
我的问题是当我想通过 Nest 检索这个对象时。
DateToBeUsed 的值始终采用以下格式:MM/dd/yyyy HH:mm:ss
(例如:2012 年 5 月 21 日 09:51:34)
(使用sense,值格式正确。)
1°) 这正常吗?
我需要检索与我提供给 ES 的日期格式相同的日期格式。
(而且我觉得和映射中描述的格式一样应该是正常的)
2°) 有解决这个问题的"clean"方案吗?
(检索文档后重新格式化日期不是 "clean" 解决方案...)
感谢您的回答!
再见
我已尝试使用以下代码重现您所看到的内容,但在 Get
调用中按预期返回了日期值:
string indexName = "so-27927069";
// --- create index ---
client.CreateIndex(cid => cid.Index(indexName));
Console.WriteLine("created index");
// --- define map ---
client.Map<MyType>(m => m
.Index(indexName)
.Type("myType")
.MapFromAttributes());
Console.WriteLine("set mapping");
// ---- index -----
client.Index<MyType>(
new MyType
{
DateToBeUsed = new DateTime(2012, 5, 21, 9, 51, 34, 73)
.ToString("yyyy-MM-ddThh:mm:ss.fff"),
ElasticId = "2"
},
i => i
.Index(indexName)
.Type("myType")
.Id(2)
);
Console.WriteLine("doc indexed");
// ---- get -----
var doc = client.Get<MyType>(i => i
.Index(indexName)
.Type("myType")
.Id(2)
);
Console.WriteLine();
Console.WriteLine("doc.Source.DateToBeUsed: ");
Console.WriteLine(doc.Source.DateToBeUsed);
Console.WriteLine();
Console.WriteLine("doc.RequestInformation.ResponseRaw: ");
Console.WriteLine(Encoding.UTF8.GetString(doc.RequestInformation.ResponseRaw));
我看到以下结果作为输出:
created index
set mapping
doc indexed
doc.Source.DateToBeUsed:
2012-05-21T09:51:34.073
doc.RequestInformation.ResponseRaw:
{"_index":"so-27927069","_type":"myType","_id":"2","_version":1,"found":true,"_source":{
"ElasticId": "2",
"DateToBeUsed": "2012-05-21T09:51:34.073"
}}
(通过 Fiddler 观察流量,我发现 ResponseRaw
值与对 Get
请求的响应有效负载完全匹配。)
我使用的是 Elasticsearch 1.5.2 版和 NEST 1.6.0 版。 (也许您看到的问题已在此期间的某个时间得到解决....)
我有以下 C# 模型:
[ElasticType(Name = "myType")]
public class MyType
{
...
[ElasticProperty(Name = "ElasticId")]
[DataMember(Name = "ElasticId")]
public string ElasticId { get; set; }
...
[ElasticProperty(Name = "DateToBeUsed", Type = FieldType.Date, DateFormat = "date_hour_minute_second_millis")]
public string DateToBeUsed { get; set; }
...
}
"date_hour_minute_second_millis"对应格式如下:yyyy-MM-dd'T'HH:mm:ss.SSS (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-date-format.html)
映射 ES 是使用 Nest 使用 "map" 方法完成的,对应于:
"mappings": {
"myType": {
"properties": {
...,
"ElasticId": {
"type": "string"
},
...,
"DateToBeUsed": {
"type": "date",
"format": "date_hour_minute_second_millis"
},
...
}
}
}
我在此索引中插入一个文档:
"_source": {
...,
"ElasticId": "2",
...,
"DateToBeUsed": "2012-05-21T09:51:34.073",
...
}
我的问题是当我想通过 Nest 检索这个对象时。
DateToBeUsed 的值始终采用以下格式:MM/dd/yyyy HH:mm:ss (例如:2012 年 5 月 21 日 09:51:34)
(使用sense,值格式正确。)
1°) 这正常吗?
我需要检索与我提供给 ES 的日期格式相同的日期格式。 (而且我觉得和映射中描述的格式一样应该是正常的)
2°) 有解决这个问题的"clean"方案吗? (检索文档后重新格式化日期不是 "clean" 解决方案...)
感谢您的回答! 再见
我已尝试使用以下代码重现您所看到的内容,但在 Get
调用中按预期返回了日期值:
string indexName = "so-27927069";
// --- create index ---
client.CreateIndex(cid => cid.Index(indexName));
Console.WriteLine("created index");
// --- define map ---
client.Map<MyType>(m => m
.Index(indexName)
.Type("myType")
.MapFromAttributes());
Console.WriteLine("set mapping");
// ---- index -----
client.Index<MyType>(
new MyType
{
DateToBeUsed = new DateTime(2012, 5, 21, 9, 51, 34, 73)
.ToString("yyyy-MM-ddThh:mm:ss.fff"),
ElasticId = "2"
},
i => i
.Index(indexName)
.Type("myType")
.Id(2)
);
Console.WriteLine("doc indexed");
// ---- get -----
var doc = client.Get<MyType>(i => i
.Index(indexName)
.Type("myType")
.Id(2)
);
Console.WriteLine();
Console.WriteLine("doc.Source.DateToBeUsed: ");
Console.WriteLine(doc.Source.DateToBeUsed);
Console.WriteLine();
Console.WriteLine("doc.RequestInformation.ResponseRaw: ");
Console.WriteLine(Encoding.UTF8.GetString(doc.RequestInformation.ResponseRaw));
我看到以下结果作为输出:
created index
set mapping
doc indexed
doc.Source.DateToBeUsed:
2012-05-21T09:51:34.073
doc.RequestInformation.ResponseRaw:
{"_index":"so-27927069","_type":"myType","_id":"2","_version":1,"found":true,"_source":{
"ElasticId": "2",
"DateToBeUsed": "2012-05-21T09:51:34.073"
}}
(通过 Fiddler 观察流量,我发现 ResponseRaw
值与对 Get
请求的响应有效负载完全匹配。)
我使用的是 Elasticsearch 1.5.2 版和 NEST 1.6.0 版。 (也许您看到的问题已在此期间的某个时间得到解决....)