У меня есть это отображение:
"mapping": {
"message": {
"dynamic_templates": [
{
"internal_fields": {
"match": "gl2_*",
"mapping": {
"type": "keyword"
}
}
},
{
"store_generic": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
...
<abbreviated>
..
"sqldocumentid": {
"type": "keyword"
},
"stacktrace": {
"type": "keyword"
},
"streams": {
"type": "keyword"
},
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss.SSS"
},
"type": {
"type": "keyword"
}
}
}
}
}
Я могу отправить этот вызов вручную, чтобы он возвратил поле "timestamp" в "epoch_millis", и оно работает:
{
"version": true,
"size": 500,
"sort": [
{
"timestamp": {
"order": "desc",
"unmapped_type": "boolean"
}
}
],
"_source": {
"excludes": []
},
"aggs": {
"2": {
"date_histogram": {
"field": "timestamp",
"interval": "10m",
"time_zone": "Europe/London",
"min_doc_count": 1
}
}
},
"stored_fields": [
"*"
],
"script_fields": {},
"docvalue_fields": [
{
"field": "timestamp",
"format": "epoch_millis"
}
],
"query": {
... <abbreviated>
I Сейчас я пытаюсь изменить существующий запрос NEST, который выполняет / редактирует тот же поиск, но заставляет его возвращать время EPOCH вместо того, чтобы его мог прочитать человек.
ДО:
var scrollObserver = client.ScrollAll<Models.ERDetail>("2m", numberOfSlices, s => s
.MaxDegreeOfParallelism(numberOfSlices)
.Search(search => search
.Size(10000)
.Index("graylog_*")
.Sort(sort => sort
.Ascending(f => f.timestamp))
.Query(qry => qry
.Bool(b => b
.Filter(
fq => fq
.Exists(e => e
.Field("sqldocumentid")
.Field("humanmessage")
.Field("importstatus")
.Field("originalnumber")
)
)
.Must(m => m
.QueryString(qs => qs
.Fields("sqldocumentid")
.Query(condition)))))
)
)
AFTER:
var scrollObserver = client.ScrollAll<Models.ERDetail>("2m", numberOfSlices, s => s
.MaxDegreeOfParallelism(numberOfSlices)
.Search(search => search
.Size(10000)
.Index("graylog_*")
.Sort(sort => sort
.Ascending(f => f.timestamp))
.Query(qry => qry
.Bool(b => b
.Filter(
fq => fq
.Exists(e => e
.Field("sqldocumentid")
.Field("humanmessage")
.Field("importstatus")
.Field("originalnumber")
)
)
.Filter(fd => fd
.DateRange(dr => dr
.Field("timestamp")
.Format("epoch_millis")))
.Must(m => m
.QueryString(qs => qs
.Fields("sqldocumentid")
.Query(condition)))))
.DocValueFields(df => df
.Field("timestamp", boost: null, format: "epoch_millis")))
POCO:
[Date(Name = "timestamp", Format = "epoc_millis")]
public string timestamp { get; set; } // have tried DateTime here as well
public string originalnumber { get; set; }
public string insertednumber { get; set; }
public string importstatus { get; set; }
public string humanmessage { get; set; }
public string sqldocumentid { get; set; }
Но независимо от этих изменений, NEST возвращается с нормально выглядящей временной меткой или исключает недопустимый формат типа входящей даты, когда POCO использует DateTime вместо строки.
Буду признателен за любую помощь, чтобы NEST вернул то же самое, что и мой тест скручивания (отметка времени в эпоху).
Я бы хотел, чтобы ES выполнял "тяжелую работу" "и не обрабатывать читаемую человеком метку времени до UT C в C# land.
Edit:
Пример метки времени, возвращаемой эластичным поиском с использованием NEST:
2020-01-24 11:12:09.22
Использование этой метки времени с помощью curl и epoch_millis преобразуется в мое желание.
Я использую NEST 7.5.1. NET Стандарт