Фильтр по времени с любой датой

Я хочу фильтровать документы только по времени. Например, если я предоставляю метки времени, такие как: 7:00:00 и 15:00:00 по Гринвичу, они должны возвращать даты, такие как 15 Dec 2020, 30 April 1340 и так далее.

Этот запрос явно не работает (я использую клиент node.js), потому что он возвращает любую дату между 1000 и 3000 годами:

searchResult = await esClient.transport.request({
  method: 'GET',
  path: 'events/_search',
  body: {
    query: {
      bool: {
        must: {
           range: {
             date: {
               gte: '1000-07-15T07:00:00Z',
               lte: '3000-07-15T15:00:00Z'
             }
           }
         }
      }
    },
  }
});

А также этот запрос, потому что, согласно этой документации, предоставленные мной метки времени (7:00:00 и 15:00:00) преобразуются в даты со значениями по умолчанию:

searchResult = await esClient.transport.request({
  method: 'GET',
  path: 'events/_search',
  body: {
    query: {
      bool: {
        must: {
           range: {
             date: {
               'gte': '7:00:00',
               'lte': '15:00:00',
                format: 'HH:mm:ss'
             }
           }
         }
      }
    },
  }
});

Как фильтровать только по времени, а не по дням, месяцам, годам?

0
0
889
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавление к части «Отсутствующие компоненты даты» из документов — если нет YYYY-MM-DD, по умолчанию будет 1970-01-01.

Что обычно делается, когда вы хотите запросить диапазоны времени без даты, так это то, что вы сохраняете время, прошедшее с полуночи этого дня, в чисто числовом значении. В зависимости от требований к точности варианта использования это может быть

  • час (как, например, в задаче часов работы)
  • секунды с полуночи
  • и т. д.

Таким образом, у вас останется простой числовой range запрос. Затем входящие диапазоны, конечно, должны быть предоставлены в формате, совместимом с тем, как вы сохраняете значения времени.

Мне удалось это сделать, сохранив два отдельных поля: дату strict_date и время strict_hour_minute_second:

searchResult = await esClient.transport.request({
  method: 'GET',
  path: 'events/_search',
  body: {
    query: {
        range: {
          time: {
            gte: '14:20:00',
            lte: '14:30:00'
          }
        }
      }
  }
});

Другие вопросы по теме