4

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

(5 / ((3.16*pow(10,-11)) * abs(time() - doc[\'date\'].date.getMillis()) + 0.2)) + 1.0

它是用 MVEL 编写的,但从 1.3 开始,Groovy 不推荐使用 MVEL。该脚本现在抛出此错误:

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

4

2 回答 2

4

正如您已经发现的那样,您需要在 Groovy 而不是 MVEL 中重写您的脚本。而不是你需要使用的时间DateTime.now().getMillis()。这是您如何使用它的示例:http ://writequit.org/org/es/index.html#time-in-groovy-script

于 2015-01-07T10:17:56.440 回答
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)。

于 2014-08-25T21:23:47.123 回答