Я хочу фильтровать документы только по времени. Например, если я предоставляю метки времени, такие как: 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'
}
}
}
}
},
}
});
Как фильтровать только по времени, а не по дням, месяцам, годам?
Добавление к части «Отсутствующие компоненты даты» из документов — если нет 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'
}
}
}
}
});