Как написать запрос диапазона дат в клиенте Nest ElasticSearch?

У меня есть приложение .Net, пытающееся извлечь данные из хранилища документов elasticsearch, имея записи в следующей структуре:

{
  "_index": "TestIndex",
  "_type": "amqp",
  "_id": "123",
  "_source": {
    "@timestamp": "2014-10-27T01:31:54.780Z",    
    "type": "amqp",        
    "LogGenerationTime": "2014-10-26T21:31:54.780",    
    "ThreadID": "6",
    "ProcessID": "8136",
    "SessionID": "xyz",
    "UserID": "12345678",
  },  
}

Я хочу получить все записи с LogGenerationTime за последние 20 минут. Здесь запрос, который я написал до сих пор, но он, похоже, не возвращает никаких данных:

    var format = "yyyy-MM-dd'T'HH:mm:ss.fff";
    var lowerBound = DateTime.Now.AddMinutes(-20);
    ISearchResponse<Amqp> resultSet = _elasticSearchClient.Search<Amqp>(q => q.Query
                    (p => p.Range
                        (v => v.OnField
                            (x => x.LogGenerationTime).GreaterOrEquals(lowerBound, format))));

Может кто-нибудь может помочь написать правильный запрос для получения ожидаемых результатов? Спасибо!

Ответ 1

Посмотрев на исходный код, есть две перегрузки метода OnField. Когда я использую тот, который принимает параметр выражения Linq, запрос не возвращает никаких данных. Но мне удалось заставить его работать с другой перегрузкой, которая принимает строковое значение, где я передаю имя поля документа elasticsearch в виде строки. Здесь запрос, который возвращает ожидаемые результаты:

var resultSet = _elasticSearchClient.Search<Amqp>(q => q.Query
                (p => p.Range(v => v.OnField("LogGenerationTime").GreaterOrEquals(lowerBound))).Size(10000));

Похож на ошибку в структуре, но я не совсем уверен.

Ответ 2

Следующий код работает для меня:

Range(r => r.GreaterOrEquals(lowerBound).Format("MM/dd/yyyy").OnField(LogTime))