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();
Другие вопросы по тегам