尝试呈现时,Elasticsearch搜索模板导致“不正确的封闭变量”

时间:2019-03-27 20:15:09

标签: elasticsearch

我要在Elasticsearch 6.6.2上使用以下模板:

{
{{#hasSpecialIDFilters}}
    "query": {
        "bool": {
            "must": [
                {
                    "terms": {
                        "mySpecialID": [{{#join}}mySpecialIDFilters{{/join}}]
                    }
                }
            ]
        }
    },
{{/hasSpecialIDFilters}}
    "sort": [
        {
            "mySortingField": "desc"
        }
    ]
}

我有一个Java应用程序,它将这个模板转换为RESTful请求主体的一部分,并将其发送到我的集群。我应该注意,我还有其他可以在此系统中正常运行的模板。结果请求是:

{
    "script": {
        "lang": "mustache",
        "source":"{{{#hasSpecialIDFilters}}\"query\":{\"bool\":{\"must\":[{\"terms\":{\"mySpecialID\":[{{#join}}mySpecialIDFilters{{/join}}]}}]}},{{/hasSpecialIDFilters}}\"sort\":[{\"mySortingField\":\"desc\"}]}"    }
}

当我尝试渲染模板时:

POST _render/template/my-special-template

我收到以下错误:

{
    "error": {
        "root_cause": [
            {
                "type": "general_script_exception",
                "reason": "Failed to compile stored script [my-special-template] using lang [mustache]"
            }
        ],
        "type": "general_script_exception",
        "reason": "Failed to compile stored script [my-special-template] using lang [mustache]",
        "caused_by": {
            "type": "mustache_exception",
            "reason": "Improperly closed variable in query-template:1"
        }
    },
    "status": 500
}

如果我删除了{{#hasSpecialIDFilters}}{{/hasSpecialIDFilters}}行,则该模板可以很好地呈现,但是我将该值用作布尔值来指示是否应在其中包括条件数组布尔查询。我不确定为什么这是个问题,因为从语法上看,一切都正确。

对我来说,一种解决方法是仅维护两个单独的模板,一个需要mySpecialIDFilters数组,而一个不包含它,而我的调用代码指定要调用哪个模板,但我宁愿将其放在一个模板中模板。

有人知道可能是什么问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要使用None函数来代替join函数,它将起作用:

toJson

然后您可以像这样调用模板,它将起作用:

{
{{#hasSpecialIDFilters}}
    "query": {
        "bool": {
            "must": [
                {
                    "terms": {
                        "mySpecialID": {{#toJson}}mySpecialIDFilters{{/toJson}}
                    }
                }
            ]
        }
    },
{{/hasSpecialIDFilters}}
    "sort": [
        {
            "mySortingField": "desc"
        }
    ]
}