Я опубликую то, что мы выяснили, в комментариях в качестве ответа, поскольку я думаю, что есть пара вещей, которые можно улучшить, чтобы повысить производительность и удобочитаемость.
Решение:
Запрос из вопроса использовал .Field(f => f.timestamp)
, который был переведен NEST для использования timestamp
поле, а не @timestamp
. Простое изменение на .Field("@timestamp")
решит проблему, так как это правильное имя поля в отображении индекса.
{
"logstash-2019-06-28": {
"mappings": {
"logevent": {
"properties": {
"@timestamp": {
"type": "date"
},
..
}
}
}
}
}
Мы также можем пометить свойство timestamp
атрибутом PropertyName
, чтобы сообщить NEST, что имя @timestamp
будет использоваться вместо timestamp
public class SearchEventDto : IDto
{
[KendoColumn(Order = 1, DisplayName = "Timestamp", UIType = UIType.DateTime)]
[PropertyName("@timestamp")]
public DateTime timestamp { get; set; }
}
и запрос
var query = client.Search<SearchEventDto>(s => s
.AllIndices()
.AllTypes()
.Query(q => q
.MatchAll() && +q
.DateRange(r =>r
.Field(f => f.timestamp)
.LessThanOrEquals(new DateTime(2019,06,01, 0, 0, 0))
)
)
);
будет просто работать.
Улучшения:
Запрос только конкретных индексов:
var query = client.Search<SearchEventDto>(s => s
.AllIndices()
.AllTypes()
..
Используя AllIndices()
, мы сообщаем упругому поиску, чтобы попытаться собрать документы по всем индексам, мы могли бы немного изменить его, чтобы запрашивать только индексы с данными журналов:
var query = client.Search<SearchEventDto>(s => s
.Index("logstash-*")
.Type("logevent")
..
Использовать контекст фильтра для фильтра диапазона дат:
.Query(q => q.Bool(b => b.Filter(f => f.DateRange(..))))
Таким образом, ваш запрос должен быть быстрее, так как он не заботится о расчете показателя релевантности поиска. Подробнее об этом можно прочитать здесь .
Надеюсь, это поможет.