Упрощенный поиск диапазона дат поиска лямбда-выражения - PullRequest
0 голосов
/ 26 января 2019

Использование Nest для ElasticSearch. введите описание изображения здесь

часть индекса выглядит следующим образом: "startdate": "2018-11-01T00: 00: 00", "enddate": "2018-11-01T00:00:00 «Мой запрос на fluentAPI выглядит следующим образом:

 var response = client.Search<ActivityReportsSearchViewModel>(x => x
                    .Size(500)
                    .Query(q => q.Bool(b => b.Must
                    (mu => mu.MultiMatch(m => m
                        .Fields(n => n.Fields(f => f.User, f => f.Activity
                            , f => f.County, f => f.Constituency, f => f.Country
                            , f => f.ActivityRequestDescription, f => f.ActivityDescription,
                            f => f.LessonsLearnt, f => f.Challenges, f => f.Recommendatinons, f => f.User
                            , f => f.Venue, f => f.Division))
                        .Query(**search**)))
                .**Filter**(fi => fi
                    .DateRange(r => r
                        .Field(f => f.StartDate)
                        .GreaterThan("2018-08-20")
                        .LessThanOrEquals(DateMath.Now)
                    )))));

Запрос выполняется нормально и возвращает фильтр результатов БЕЗ .После добавления фильтра, как показано выше, запрос не возвращает результатов.Может кто-нибудь указать на проблему с кодом fluentAPI

1 Ответ

0 голосов
/ 28 января 2019

Можно проверить response.IsValid, чтобы определить, является ли запрос действительным для вызова API Elasticsearch.

response.DebugInformation предоставит более подробную информацию о вызове API в удобном для чтения формате, в том числе в случае ошибки. Если это ошибка в Elasticsearch, response.ServerError будет заполнен деталями.

Не зная дополнительных подробностей об ответе, я подозреваю, что проблема заключается в синтаксическом анализе строки "2018-08-20" в качестве даты на стороне сервера Elasticsearch. Elasticsearch попытается проанализировать строку в дату, используя формат, указанный в отображении поля date для StartDate, и если дата в поисковом запросе находится в другом формате, вы можете указать формат в DateRange запрос с .Format(...).

Если исходно индексировать документ с помощью клиента .NET и использовать сериализацию DateTime по умолчанию, вы можете просто использовать экземпляр DateTime для предоставления необходимой даты

.DateRange(r => r
    .Field(f => f.StartDate)
    .GreaterThan(new DateTime(2018, 8, 20))
    .LessThanOrEquals(DateMath.Now)
)

, который будет сериализован как

"2018-08-20T00:00:00"

в том же формате, что и поле в индексе. Кроме того, вы можете передать строку в этом формате.

...