Elasticsearch: сравнение дат (безболезненный сценарий)
Мое отображение createdAt
:
"createdAt": {
"type": "date"
},
Я вставляю даты как это:
POST logs/_doc/_bulk?pretty
{"index":{"_id":1}}
{"createdAt":"2018-05-01T07:30:00Z","value":"on"}
Когда я запрашиваю документы
GET logs/_doc/_search
Это показывает мне дату, поскольку я вставил это:
"_source": {
"createdAt": "2018-05-01T07:30:00Z",
"value":"on"
}
Теперь я хотел бы сравнить эту дату с текущим временем:
"map_script": {
long timestampLog = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S").parse(doc.createdAt.value).getTime();
long timestampNow = new Date().getTime();
if (timestampNow < timestampLog) {
// case 1
} else {
// case 2
}
}
Weird:doc.createdAt.value
возвращается "2018-05-01T07:30:00.000Z"
, который включает в себя миллисекунды, которые я никогда не добавлял.
Эта ошибка возникает при разборе:
Cannot cast org.joda.time.MutableDateTime to java.lang.String
Когда я заменяю doc.createdAt.value
по струне 2018-05-01T07:30:00.000Z
, оно работает.
Любая помощь приветствуется. Большое спасибо!
2 ответа
Поля индекса Elasticsearch с типами даты org.joda.time.DateTime
в безболезненном. С использованием SimpleDateFormat
является источником ошибки. Попробуйте это вместо этого:
long timestampLog = doc['createdAt'].value.getMillis();
long timestampNow = new Date().getTime();
Остальное работает как есть.
Проверено на Elasticsearch 6.3.0.
Пожалуйста, удалите большой S
в formatter
проверьте паттерны даты и времени
long timestampLog = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").parse(doc.createdAt.value).getTime();
long timestampNow = new Date().getTime();