如何使用Elasticsearch从当前时间减去日期?

时间:2015-04-09 10:56:47

标签: date elasticsearch

我正在尝试计算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]];}] “

我现在不确定脚本是否正确使用。看起来它应该很简单,但我似乎找不到任何例子。

这甚至可以吗?有没有更好的方法呢?

任何帮助都将不胜感激。

1 个答案:

答案 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以天为单位)