Search code examples
node.jselasticsearchelasticsearch-painless

How to add multiline painless code in nodejs


So in my js-code I have this line:

            var _script = {
                _script: {
                    script: {
                        lang: 'painless',
                        source: `
                        """
                        if(1>2){
                            params._source.id;
                        }
                        else{
                            params._source.id;
                        }
                        """
                        `
                    },
                    type: 'string',
                    order: params._source.id
                }
            }

This will fail. I see in the log this error message:

,\"reason\":\"unexpected token ['\\\"\\\\n                            if(1>2){\\\\n                                params._source.id;\\\\n                            }\\\\n                            else{\\\\n                                params._source.id;\\\\n                            }\\\\n                            \\\"'] was expecting one of [{<EOF>, ';'}].\"}}}]},

I have tried first to have without tilde-character. And then it also fails. I then tried to have tilde at the beginning, something like:

var _script = `{                

Thing is that the final json that will be sent to elastic is not shown in the code above. So "_script" is only a little part of all the json. I was wondering if I added the tilde at the very beginning and end of the whole json. Maybe it could work? I need to work it out where it is. But just in theory: do you think the problem is there? Putting the tilde around all the json? Or is it something else?


Solution

  • The triple " is not valid JSON, it only works internally to the Elastic stack (i.e. from Kibana Dev Tools to ES).

    The way I usually do it from Node.js is to add each line to an array and then I join that array, like this:

    const code = [];
    code.push("if(1>2){");
    code.push("params._source.id;");
    code.push("} else {");
    code.push("params._source.id;");
    code.push("}");
    
    source = code.join(" ");
    

    It's not super legible, I admit. Another way is to use stored scripts so you can simple reference your script by ID in Node.js.