我正在尝试从包含时间戳的 kibana_sample_data_flights 索引中获取一组数据。运行查询时,ElasticSearch 正确识别它并返回结果,但它崩溃了
无效的日期时间格式。价值:2019-06-03T
上
Elasticsearch.Net.Utf8Json.Formatters.ISO8601DateTimeFormatter.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
第一次,我认为是我的对象被错误地索引并简单地排除了结果,但我在另一个条目上得到了同样的错误。使用 Kibana 搜索,它可以工作,时间戳为2019 年 6 月 2 日 @ 20:00:00.000,这很有意义,因为我在 UTC-5 区域。
如何让 NEST / ElasticSearch.net 正确识别日期?
--Edit 1:根据要求提供弹性版本和示例代码。
我正在使用 NEST 和 ElasticSearch.Net v7.0.0。ElasticSearch 版本请求返回
{
"name" : "M79539",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "CxG9dTeSTsudlhJBGiVmJQ",
"version" : {
"number" : "7.1.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "606a173",
"build_date" : "2019-05-16T00:43:15.323135Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
如果它可以帮助,这里是程序
class Program
{
static void Main(string[] args)
{
//Kibana: http://m79539:5601/app/kibana#/home?_g=()
// NEST
var settings = new ConnectionSettings(new Uri("http://m79539:9200/"))
.DefaultIndex("kibana_sample_data_flights")
.DefaultFieldNameInferrer(p => p);
var client = new ElasticClient(settings);
var scrollTimeout = "5m";
var scrollSize = 1000;
var initialResponse = client.Search<FlightDetail>(s => s
.From(0).Take(scrollSize)
.Query(q => +q
.DateRange(r => r
.Field(f => f.Timestamp)
.GreaterThan(DateMath.Anchored(new DateTime(2019,06,01)))
.LessThan(DateMath.Now)) && +!q
.Term(p => p.FlightNum, "59H86EL")
)
.Scroll(scrollTimeout)
//scroll is optimized for this sort and we will sort in our own code
.Sort(ss => ss.Ascending(SortSpecialField.DocumentIndexOrder))
);
var results = new List<FlightDetail>();
if (!initialResponse.IsValid || string.IsNullOrEmpty(initialResponse.ScrollId))
throw new Exception(initialResponse.ServerError.Error.Reason);
if (initialResponse.Documents.Any())
results.AddRange(initialResponse.Documents);
string scrollid = initialResponse.ScrollId;
bool isScrollSetHasData = true;
while (isScrollSetHasData)
{
ISearchResponse<FlightDetail> loopingResponse = client.Scroll<FlightDetail>(scrollTimeout, scrollid);
if (loopingResponse.IsValid)
{
results.AddRange(loopingResponse.Documents);
scrollid = loopingResponse.ScrollId;
}
isScrollSetHasData = loopingResponse.Documents.Any();
}
client.ClearScroll(new ClearScrollRequest(scrollid));
foreach (var result in results){
Console.WriteLine($"{result.Timestamp} | {result.FlightNum} | {result.FlightDelayMin}");
}
}
}
public class FlightDetail
{
public string FlightNum { get; set; }
public int FlightDelayMin { get; set; }
public object Source { get; set; }
[Nest.Text(Name = "timestamp")]
public DateTime Timestamp { get; set; }
}
有问题的结果(在我的安装上)是 548
{
"_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAANizsWaTdsY3ViS2hUR2FyRHZESmdKeVRWZw==",
"took": 1,
"timed_out": false,
"terminated_early": true,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 9227,
"relation": "eq"
},
"max_score": null,
"hits": [{
"_index": "kibana_sample_data_flights",
"_type": "_doc",
"_id": "1Lr3DmsBoDCXrrhScXCk",
"_score": null,
"_source": {
"FlightNum": "86C3GQY",
"DestCountry": "MX",
"OriginWeather": "Sunny",
"OriginCityName": "Rome",
"AvgTicketPrice": 395.9230418749486,
"DistanceMiles": 6362.054220749258,
"FlightDelay": false,
"DestWeather": "Damaging Wind",
"Dest": "Licenciado Benito Juarez International Airport",
"FlightDelayType": "No Delay",
"OriginCountry": "IT",
"dayOfWeek": 0,
"DistanceKilometers": 10238.733787837495,
"timestamp": "2019-06-03T",
"DestLocation": {
"lat": "19.4363",
"lon": "-99.072098"
},
"DestAirportID": "AICM",
"Carrier": "JetBeats",
"Cancelled": false,
"FlightTimeMin": 602.2784581080879,
"Origin": "Leonardo da Vinci - Fiumicino Airport",
"OriginLocation": {
"lat": "41.8002778",
"lon": "12.2388889"
},
"DestRegion": "MX-DIF",
"OriginAirportID": "FCO",
"OriginRegion": "SE-BD",
"DestCityName": "Mexico City",
"FlightTimeHour": 10.037974301801464,
"FlightDelayMin": 0
},
"sort": [4379]
}]
}
}
--- 编辑 2:基于@Rob 命题的更简单的代码示例。以同样的问题结束。我添加了 try/catch 以便能够中断错误,然后查看 Fiddler 中发生的情况。
private static void SimpleSample()
{
var client = new ElasticClient(new Uri("http://m79539:9200"));
for (var i = 0; ; i++)
{
try
{
var results = client.Search<SampleData>(s => s
.Index("kibana_sample_data_flights")
.From(i * 10)
.Query(q => q.MatchAll()));
foreach (var document in results.Documents)
{
Console.WriteLine(document.Timestamp.ToString("f") + "|" + document.FlightNum);
}
}
catch (Elasticsearch.Net.UnexpectedElasticsearchClientException ex)
{
Console.WriteLine(ex.Message);
}
}
}
private class SampleData
{
public DateTime Timestamp { get; set; }
[Nest.Text(Name = "FlightNum")]
public string FlightNum { get; set; }
}