Поиск по диапазону дат с использованием NEST не возвращает данные - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу использовать поиск по диапазону дат в Elasticsearch с использованием NEST API.

Просто это работает, когда я ищу так:

                        .DateRange(c => c
                            .Name("myquery")
                            .Boost(1.1)
                            .Field(p => p.CreatedOnUtc)
                            .GreaterThanOrEquals(DateMath.Now.Subtract("3d")) //this works fine
                            .LessThanOrEquals(DateMath.Now)
                            .Format("dd/MM/yyyy||yyyy")
                            .TimeZone("+01:00")
                            )

Bu, когда я хочу использовать свой пользовательский fromDate Значение Datetime вместо DateMath.Now.Subtract ("3d") ничего не возвращает!

Я пробовал много разных строк кода, как показано ниже, но ни один из они сработали!

.GreaterThan(DateMath.Anchored(fromDate))

или

.GreaterThanOrEquals(DateMath.Anchored(fromDate).RoundTo(DateMathTimeUnit.Day))

или

.GreaterThan(new DateTime(2012, 01, 01, 11, 0, 0))

Возвращенный образец json Значение для моего поля даты и времени:

"createdOnUtc": "2020-04-08T15:53:36.4800870Z"

Я нашел соответствующую документацию / пример запроса на веб-сайте Elasticsearch, расположенный здесь , но это не помогло мне, здесь я скопировал пример синтаксиса Object Initializer из документации:

new DateRangeQuery
{
    Name = "named_query",
    Boost = 1.1,
    Field = "description",
    GreaterThan = FixedDate,
    GreaterThanOrEqualTo = DateMath.Anchored(FixedDate).RoundTo(DateMathTimeUnit.Month),
    LessThan = "01/01/2012",
    LessThanOrEqualTo = DateMath.Now,
    TimeZone = "+01:00",
    Format = "dd/MM/yyyy||yyyy"
}

Является ли проблема, связанная с Format / TimeZone или что мне здесь не хватает?

1 Ответ

0 голосов
/ 15 апреля 2020

Когда в запросе указано Format = "dd/MM/yyyy||yyyy", Elasticsearch ожидает получения строки DateTime в одном из этих форматов и будет использовать предоставленный формат (ы), чтобы попытаться проанализировать строку DateTime в допустимый экземпляр DateTime в пределах Elasticsearch.

С

DateMath.Anchored(fromDate)

или

new DateTime(2012, 01, 01, 11, 0, 0)

клиент сериализует их в строковые представления ISO8601 DateTime , поэтому ввод для эти значения не соответствуют предоставленному формату (ам) в запросе.

Глядя на ваш первый пример выше, похоже, вам не нужно указывать значение для Format. Если формат не указан, Elasticsearch будет использовать формат, указанный в отображении поля date для CreatedOnUtc, а если его нет, будет использовать формат "strict_date_optional_time||epoch_millis" по умолчанию для типов даты , который будет анализировать строки даты ISO8601, созданные клиентом.

...