ElasticSearch在Groovy脚本中获取时间

时间:2014-08-25 18:55:45

标签: groovy elasticsearch timestamp mvel

我的应用程序正在使用此脚本来提升索引中的最新项目:

(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?

2 个答案:

答案 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)。