groovy - painless - elasticsearch script source
ElasticSearch obtiene tiempo en Groovy Script (2)
Mi aplicación está utilizando esta secuencia de comandos para aumentar los elementos más recientes en el índice:
(5 / ((3.16*pow(10,-11)) * abs(time() - doc[/'date/'].date.getMillis()) + 0.2)) + 1.0
Está escrito en MVEL, pero a partir de 1.3, MVEL está en desuso para Groovy. La secuencia de comandos arroja este error ahora:
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)]]
Esto me parece que la función para obtener una marca de tiempo de milisegundo es diferente en Groovy. Intenté System.currentTimeMillis()
, pero me dio otro error al decir que no era compatible con las importaciones.
Entonces, ¿cómo puedo arreglar la función time()
para trabajar con Groovy?
No descubrí cómo obtener el tiempo dentro del script, pero parece que puede agregar variables a la consulta que están disponibles en el script. Aquí está el JSON resultante.
"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"
}
}
],
}
Y mi aplicación genera la marca de tiempo (en este caso 1409001061000
).
Como ya ha descubierto, necesita volver a escribir su script en Groovy en lugar de MVEL. En lugar de tiempo, necesita utilizar DateTime.now().getMillis()
. Aquí hay un ejemplo de cómo lo usa: http://writequit.org/org/es/index.html#time-in-groovy-script