В настоящее время я сталкиваюсь с проблемой с моим эластичным поиском, когда я пытаюсь извлечь из него данные.
У меня есть значение метки времени, которое сохраняется следующим образом:
Timestamp = DateTime.UtcNow;
И свойство Timestamp выглядит так в моем объекте
public DateTime Timestamp { get; }
При использовании Kibana для просмотра данных метка времени имеет следующее значение:
отметка времени: 19 июня 2019 г., 16:29:24.997
Когда я пытаюсь получить данные с помощью следующего кода:
var searchResponse = await elastic.SearchAsync<SupplierPricelistStatistic>(s => s
.From(0)
.Take(2000)
.Query(q => +q
.Match(m => m
.Field(f => f.SupplierId)
.Query(id.ToString())
)
)
.Scroll("10m")
).ConfigureAwait(false);
И прокрутите его следующим образом:
var resultList = new List<SupplierPricelistStatistic>();
while (searchResponse.Documents.Any())
{
foreach (var doc in searchResponse.Hits)
{
resultList.Add(doc.Source);
}
searchResponse = await elastic.ScrollAsync<SupplierPricelistStatistic>("10m", searchResponse.ScrollId);
}
Все мои временные метки имеют следующее значение:
{01-01-0001 00:00:00}
Глядя на отображение временной метки, оно выглядит следующим образом:
"timestamp": {
"type": "date"
}
Я не могу понять, почему это происходит. Может я где-то пропустил какие-то настройки?
Обновлено:
По требованию:
Я использую NEST версии 6.6.0 и elasticsearch 6.6.2.
Полный метод сбора данных:
public async Task <List<SupplierPricelistStatistic>> GetSupplierPricelistStatistic(Guid id, IElasticClient elastic, int year, string month)
{
var searchResponse = await elastic.SearchAsync<SupplierPricelistStatistic>(s => s
.From(0)
.Take(2000)
.Query(q => +q
.Match(m => m
.Field(f => f.SupplierId)
.Query(id.ToString())
)
)
.Scroll("10m")
).ConfigureAwait(false);
var resultList = new List<SupplierPricelistStatistic>();
while (searchResponse.Documents.Any())
{
foreach (var doc in searchResponse.Hits)
{
var tempSupStat = doc.Source;
DateTime dateTime;
if (month != "0")
{
int.TryParse(month, out int intMonth);
dateTime = new DateTime(year, intMonth, DateTime.Now.Day);
if (tempSupStat.Timestamp.Year == dateTime.Year && tempSupStat.Timestamp.Month == dateTime.Month)
{
resultList.Add(tempSupStat);
}
}
else
{
dateTime = new DateTime(year, DateTime.Now.Month, DateTime.Now.Day);
if (tempSupStat.Timestamp.Year == dateTime.Year)
{
resultList.Add(tempSupStat);
}
}
}
searchResponse = await elastic.ScrollAsync<SupplierPricelistStatistic>("10m", searchResponse.ScrollId);
}
return resultList;
}
Я добавил дополнительную информацию. Я надеюсь, что этого достаточно
Так что я только что снова посмотрел на свою модель
public DateTime Timestamp { get; }
У него не было сеттера. Добавление одного решило проблему.
Какую версию NEST вы используете и на какую версию Elasticsearch ориентируетесь? Не могли бы вы показать пример небольшой, лаконичный, но полный того, что вы делаете и что видите?