我的应用程序正在使用此脚本来提升索引中的最新项目:
(5 / ((3.16*pow(10,-11)) * abs(time() - doc[\'date\'].date.getMillis()) + 0.2)) + 1.0
它是用MVEL编写的,但从1.3开始,MVEL不再用于Groovy。该脚本现在抛出此错误:
GroovyScriptExecutionException[MissingMethodException[No signature of method: Script4.time() is applicable for argument types: () values: []\nPossible solutions: find(), dump(), find(groovy.lang.Closure), use([Ljava.lang.Object;), is(java.lang.Object), with(groovy.lang.Closure)]]
这听起来像在Groovy中获得毫秒时间戳的功能是不同的。我尝试了System.currentTimeMillis()
,但它又说错了,说它不支持导入。
那么如何修复time()
函数以使用Groovy?
答案 0 :(得分:4)
正如您已经发现的那样,您需要在Groovy中重写脚本而不是MVEL。而不是时间,你需要使用DateTime.now().getMillis()
。以下是您如何使用它的示例:http://writequit.org/org/es/index.html#time-in-groovy-script
答案 1 :(得分:2)
我没有找到如何在脚本中获取时间,但似乎您可以向脚本中可用的查询添加变量。这是结果JSON。
"function_score": {
"query": /*...*/,
"functions": [
{
"filter": {
"exists": {
"field": "date"
}
},
"script_score": {
"params": {
"now": 1409001061000
},
"script": "(5 / ((3.16*pow(10,-11)) * abs(now - doc['date'].date.getMillis()) + 0.2)) + 1.0"
}
}
],
}
我的应用程序生成时间戳(在本例中为1409001061000
)。