javascript - 如何将脚本存储在字符串中?

标签 javascript node.js elasticsearch

我有一个 ElasticSearch 脚本,我需要以某种方式将其存储在某个地方,
我尝试使用反引号 "`script here`" 但它在使用字符串时添加了转义字符,
我按以下方式存储脚本 -

sortByPriceScript : `"""
            double valueForComparision = 0;

            if(doc.currency.value == 'usd'){
                valueForComparision = doc.price.value;
            }
            else{
                if(params.isUsdCheckout){
                    valueForComparision = doc.price.value / params[doc.currency.value]["buy"];
                }
                else{
                    valueForComparision = doc.price.value / params[doc.currency.value]["spot"];
                }
            }
            return valueForComparision;     
        """`

它被转换成 -

"\"\"\"\n            double valueForComparision = 0;\n\n            if(doc.currency.value == 'usd'){\n                valueForComparision = doc.price.value;\n            }\n            else{\n                if(params.isUsdCheckout){\n                    valueForComparision = doc.price.value / params[doc.currency.value][\"buy\"];\n                }\n                else{\n                    valueForComparision = doc.price.value / params[doc.currency.value][\"spot\"];\n                }\n            }\n            return valueForComparision;\t\t\n        \"\"\""

如何使用以下格式的脚本 -

GET listings/_search
{
    "query": {
        "function_score": {
            "query": {
                "constant_score": {
                    "filter": {
                        "bool": {
                            "must": [{
                                "match": {
                                    "products_status": "1"
                                }
                            }, {
                                "match": {
                                    "show_listing": "true"
                                }
                            }, {
                                "script": {
                                    "script": {
                                        "source": "doc['forecast_quantity'].value > doc['minimum_quantity'].value",
                                        "params": {}
                                    }
                                }
                            }],
                            "should": [{
                                "term": {
                                    "seller_id": "1"
                                }
                            }, {
                                "term": {
                                    "seller_id": "2"
                                }
                            }]
                        }
                    }
                }
            },
            "functions": [{
                "script_score": {
                    "script": {
                        "params": {
                            "id": 1,
                            "updated_at": 1565855175,
                            "usd": {
                                "buy": 1,
                                "sell": 1,
                                "spot": 1
                            },
                            "sgd": {
                                "buy": 0.72,
                                "sell": 0.72,
                                "spot": 0.72
                            },
                            "myr": {
                                "buy": 0.24,
                                "sell": 0.24,
                                "spot": 0.24
                            },
                            "inr": {
                                "buy": 0.014,
                                "sell": 1.014,
                                "spot": 0.014
                            },
                            "eur": {
                                "buy": 1.12,
                                "sell": 1.12,
                                "spot": 1.12
                            },
                            "isUsdCheckout": false
                        },
                        "source": """
            double valueForComparision = 0;

            if(doc.currency.value == 'usd'){
                valueForComparision = doc.price.value;
            }
            else{
                if(params.isUsdCheckout){
                    valueForComparision = doc.price.value / params[doc.currency.value]["buy"];
                }
                else{
                    valueForComparision = doc.price.value / params[doc.currency.value]["spot"];
                }
            }
            return valueForComparision;     
           """
                    }
                }
            }]
        }
    },
    "sort": [{
        "_score": {
            "order": "desc"
        }
    }]
}

运行良好 - enter image description here

最佳答案

三引号 """ 仅在 Kibana Dev Tools 中有效,您不能在 JavaScript 代码中使用它。

在 JS 代码中,您可以简单地使用反引号而不使用三引号:

esClient.search({
    index: 'index',
    size: 10,
    body: {
        query: {
            script: {
                script: {
                    source: `
                    double valueForComparision = 0;

                    if(doc.currency.value == 'usd'){
                        valueForComparision = doc.price.value;
                    }
                    else{
                        if(params.isUsdCheckout){
                            valueForComparision = doc.price.value / params[doc.currency.value]["buy"];
                        }
                        else{
                            valueForComparision = doc.price.value / params[doc.currency.value]["spot"];
                        }
                    }
                    return valueForComparision;     
                    `
                }
            }
        }
    }
}, function(err, res) {
    console.log(res);
});

关于javascript - 如何将脚本存储在字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57622766/

相关文章:

javascript - 使用 JavaScript 中的 HTTP Accept header

javascript - .onblur 函数作为变量返回。值?

node.js - $addToSet 并返回所有添加的新项目?

Javascript 检查变量是否介于 2 个值 + else 之间

node.js - 在 node.js express 中访问 HTTP 服务器对象

javascript - jade模板只需要编译一次吗?

Elasticsearch:如何对完全匹配进行排名?

java - 通过curl 的Elasticsearch REST api 无法从java.runtime.exec 运行

elasticsearch - Logstash grok过滤器,调试器可以,但是logstash解析失败

javascript - NativeScript Vue - Material 设计图标未显示