Elasticsearch:比较日期(无痛脚本)

时间:2018-06-14 08:21:39

标签: java elasticsearch lucene kibana elasticsearch-painless

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.value替换2018-05-01T07:30:00.000Z时,它可以正常工作。

感谢任何帮助。非常感谢你!

2 个答案:

答案 0 :(得分:0)

请移除S中的 formatter,查看Date and Time Patterns

long timestampLog = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").parse(doc.createdAt.value).getTime();
long timestampNow = new Date().getTime();

答案 1 :(得分:0)

日期类型的Elasticsearch索引字段轻松输入org.joda.time.DateTime。使用SimpleDateFormat是错误的根源。尝试以下方法:

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

其余的按原样工作。

在Elasticsearch 6.3.0上进行了测试。