以下是我在elasticsearch中的一份文件:
{
"_index": "2017-10-21",
"_type": "cat",
"_id": "14",
"_score": 2.2335923,
"_source": {
"name": "Biscuit",
"breed": "Persian",
"age": "3",
"purchase_date": "2017-11-11T10:16:18+0100",
"birth_date": "2017-01-21T10:16:18+0100"
}
}
我想计算“购买日期”和“购买日期”之间的时间。和' birth_date' (例如,在几分钟或几天内减去它们)并添加一个新字段' age_when_bought'这个时候(在每个文件中,品种是#34;波斯语",但这不是重点)。它应该是这样的:
POST /*/_update_by_query
{
"script" : {
"inline": "ctx._source.age_when_bought = ctx._source.purchase_date - ctx._source.birth_date"
},
"query": {
"bool": {
"must": [
{
"match": {
"breed": "Persian"
}
}
]
}
}
}
不幸的是,它并没有以这种方式运作。我的回复有错误500:
"caused_by": {
"type": "class_cast_exception",
"reason": "Cannot apply [-] operation to types [java.lang.String] and [java.lang.String]."
}
我已经尝试将这些字段转换为日期,但我可能不会使用好的函数来执行此操作:
'SimpleDateFormat.parse(ctx._source.purchase_date)'
这次我的回复仍有错误500:
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Unknown call [parse] with [1] arguments on type [SimpleDateFormat]."
}
感谢您的帮助!
答案 0 :(得分:1)
我终于找到了解决方案!
POST /*/_update_by_query
{
"script" : {
"inline": "ctx._source.age_when_bought = (new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:sszzz\").parse(ctx._source.purchase_date).getTime()
- new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:sszzz\").parse(ctx._source.birth_date).getTime())
},
"query": {
"bool": {
"must": [
{
"match": {
"breed": "Persian"
}
}
]
}
}
}
SimpleDateFormat是一个以区域设置敏感的方式格式化和解析日期的类。它允许格式化(日期 - >文本),解析(文本 - >日期)和规范化。
Date.getTime()方法返回自1970年1月1日00:00:00 GMT以来经过的毫秒数。
因此,通过执行date_1.getTime() - date_2.getTime()
,结果将是date_1和date_2之间的时间(以毫秒为单位)(假设date_1比当前日期更接近date_2。否则,结果可能相同但是为负)