#php #elasticsearch #kibana
#php #elasticsearch #kibana
Вопрос:
Я пытаюсь выполнить функцию на kibana. У меня есть индекс с заказами с некоторыми полями: datetime1
, datetime2
с форматом : yyyy-MM-dd HH:mm
Сначала я должен проверить datetime1
, существует ли он. Во-вторых, я должен проверить разницу между этими 2 датами datetime2 - datetime1
, чтобы закончить, я должен поместить результат в разные значения, если разница:
- менее 24 часов
- между 24 и 48 часами
- 48 — 72
- ….
Что я пробовал :
GET orders/_search
{
"size": 0,
"aggs": {
"test1": {
"filters": {
"filters": {
"exist_datetime1": {
"exists": {
"field": "datetime1"
}
},
"24_hours": {
"script": {
"script": {
"source": "doc['datetime2'].value - doc['datetime1'].value < 24",
"lang": "painless"
}
}
}
}
}
}
}
}
Как я могу выполнить несколько фильтров и выполнить вычитание между датами?
Спасибо за вашу помощь 🙂
Ответ №1:
Это хорошее начало, однако, я думаю, вам нужно что-то немного другое. Вот попытка предоставить нужные вам диапазоны, используя range
агрегацию, поддерживаемую вашим скриптом.
Вам нужно убедиться, что оба поля даты имеют значения ( query
часть), а затем вы можете определить нужные вам сегменты ( < 24h
, 24h - 48h
, и т.д.)
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"exists": {
"field": "datetime1"
}
},
{
"exists": {
"field": "datetime2"
}
}
]
}
},
"aggs": {
"ranges": {
"range": {
"script": {
"lang": "painless",
"source": "(doc['datetime2'].value.millis - doc['datetime1'].value.millis) / 3600000"
},
"ranges": [
{
"to": 24,
"key": "< 24h"
},
{
"from": 24,
"to": 48,
"key": "24h-48h"
},
{
"from": 48,
"key": "> 48h"
}
]
}
}
}
}
Комментарии:
1. Спасибо за ответ, он работает очень хорошо! Итак, чтобы использовать filter, лучше использовать их в запросе вместо agg?
2. Здорово, что это помогло! Да, фильтр в части запроса уменьшит набор документов, для которых выполняется агрегация.