1

我的映射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
    }
}

奇怪:
doc.createdAt.value返回"2018-05-01T07:30:00.000Z",其中包括我从未添加的毫秒数

解析时发生此错误

Cannot cast org.joda.time.MutableDateTime to java.lang.String 

当我用doc.createdAt.valuestring替换时2018-05-01T07:30:00.000Z,它可以工作。

任何帮助表示赞赏。非常感谢!

4

2 回答 2

1

具有日期类型的 Elasticsearch 索引字段非常org.joda.time.DateTime轻松。使用SimpleDateFormat是错误的来源。试试这个:

long timestampLog = doc['createdAt'].value.getMillis();
long timestampNow = new Date().getTime();

其余的按原样工作。

在 Elasticsearch 6.3.0 上测试。

于 2018-07-05T05:39:23.417 回答
1

请删除 Sformatter,检查日期和时间模式

long timestampLog = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").parse(doc.createdAt.value).getTime();
long timestampNow = new Date().getTime();
于 2018-06-14T08:29:35.907 回答