Шаблон поиска Elasticsearch, приводящий к «Неправильно закрытой переменной» при попытке рендеринга - PullRequest
0 голосов
/ 27 марта 2019

У меня есть следующий шаблон, который я пытаюсь использовать на 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, а другой без него, при этом мой вызывающий код определяет, какой из них вызывать, но я бы предпочел, чтобы он был внутри одного шаблона.

У кого-нибудь есть идеи, в чем может быть проблема?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...