es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“Secuencia inválida de tokens cerca de [‘for’]” error en la consulta de script Painless.

Estoy obteniendo un error al ejecutar esta consulta de script usando la biblioteca Nest en .net:

new ScriptQuery
{
    Lang = "painless",
    Source = "(!doc[params.headquartersCoordinatesField].empty && doc[params.headquartersCoordinatesField].arcDistance(params.latitude, params.longitude) * 0.000621371 <= params.maxDistance) || (!doc[params.offices].empty && (for (def office : doc[params.offices].values){if(office.coordinates).arcDistance(params.latitude, params.longitude) * 0.000621371 <= params.maxDistance{return true;}}))",
    Params = new Dictionary<string, object="">
    {
        {"headquartersCoordinatesField", Field<provider>(f => f.Headquarters.Coordinates)},
        {"offices", Field<provider>(f => f.Offices)},
        {"latitude", _latitude},
        {"longitude", _longitude},
        {"maxDistance", 50}
    }
}

Este es el error que obtengo:
“`
Error del servidor: Tipo: search_phase_execution_exception Razón: “todos los fragmentos fallaron” Causado por: “Tipo: script_exception Razón: “error de compilación” Causado por: “Tipo: illegal_argument_exception Razón: “secuencia inválida de tokens cerca de [‘for’].” Causado por: “Tipo: no_viable_alt_exception Razón: “no viable alt exception: null””””

También intenté una variable booleana dentro del bucle y traté de devolverla al final, pero obtengo el mismo error.

Intenté un bucle for simple con un contador (i) para verificar la sintaxis, pero obtengo el mismo error. Parece que cualquier cosa que use dentro del bucle está dando error.

¿Alguien puede ayudarme a encontrar la sintaxis correcta? Gracias de antemano.</string,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema se encuentra en el uso de la palabra clave “for” dentro del script Painless. Painless no admite bucles “for” ni constructos de bucle como “while” o “do/while”. En su lugar, puedes usar la función “anyMatch” para lograr una funcionalidad similar.

    Aquí tienes un ejemplo de cómo puedes modificar el script para usar “anyMatch” en lugar de un bucle “for”:

    new ScriptQuery
    {
        Lang = "painless",
        Source = "(!doc[params.headquartersCoordinatesField].empty && doc[params.headquartersCoordinatesField].arcDistance(params.latitude, params.longitude) * 0.000621371 <= params.maxDistance) || (!doc[params.offices].empty && doc[params.offices].values.stream().anyMatch(office -> office.coordinates.arcDistance(params.latitude, params.longitude) * 0.000621371 <= params.maxDistance))",
        Params = new Dictionary<string, object="">
        {
            {"headquartersCoordinatesField", Field<provider>(f => f.Headquarters.Coordinates)},
            {"offices", Field<provider>(f => f.Offices)},
            {"latitude", _latitude},
            {"longitude", _longitude},
            {"maxDistance", 50}
        }
    }
    

    En este script modificado, estamos utilizando el método “stream()” para convertir la colección “values” del campo “offices” en un flujo, y luego usando la función “anyMatch” para comprobar si alguna de las coordenadas de las oficinas cumple con los criterios de distancia.

    Esto debería solucionar el error de compilación que estás viendo.</string,>

Comments are closed.