我正在尝试计算Elasticsearch中文件的当前年龄。
我的计划是做一些像当前时间 - 时间戳。
我现在使用脚本执行此操作并设法从另一个
中减去一个日期字段{ "query" :
{
"match_all" : {}
},
"fields" : ["_source"],
"script_fields" :
{ "date_diff" :
{ "script" : "doc[\"two\"].date-doc[\"one\"].date"}
}
}'
虽然我觉得它做错了,因为答案绝对不正确。 (它达到了数千天的差异)
我也尝试使用Elasticsearch日期数学建议,如“现在”,“时间”,“+ 1h”等,所有这些都导致错误
“JsonParseException [无法识别的令牌'时间':期待'null','true','false'或NaN \ n在[来源:[B @ 220c4a0b; line:1,column:111]];}] “
我现在不确定脚本是否正确使用。看起来它应该很简单,但我似乎找不到任何例子。
这甚至可以吗?有没有更好的方法呢?
任何帮助都将不胜感激。
答案 0 :(得分:1)
你能展示用例吗?例如,如果您需要在UI上显示年龄,则更好地响应创建日期。如果您需要一些分析,按创建日期过滤应该可以解决问题。
如果您确定需要使用ES查询返回文档的“年龄”,请尝试:
{
"query": {
"match_all": {}
},
"fields": ["_source"],
"script_fields": {
"age": {
"script": "(DateTime.now().getMillis() - doc['created'].value)/(24*60*60*1000)"
}
}
}
ES将日期作为unix纪元时间戳处理,您应该将当前时间转换为整数以反映ms(使用DateTime.now().getMillis()
),然后从中减去doc
的值。这将为您提供以毫秒为单位的年龄。如果需要,除以任何系数(即,tj以天为单位)