Использование Mustache API для анализа запросов шаблона JSON Elasticsearch
Я использую класс SearchTemplateRequest для выполнения своих запросов, который использует шаблон Mustache для анализа моей строки шаблона с переданными параметрами.
Шаблон Elasticsearch - преобразование параметров в JSON
Однако мне нужно изменить свою реализацию, где я перейду на низкоуровневый клиент Java. Я хочу использовать реализацию Mustache, которую SearchTemplateRequest использует для внутреннего анализа шаблона. Я могу использовать зависимость Mustache или ее реализацию Elasticsearch. Может ли кто-нибудь помочь мне здесь?
Моя строка шаблона:
{
"query": {
"bool": {
"filter": "{{#toJson}}clauses{{/toJson}}"
}
}
}
Мой объект Params:
{
"clauses": [
{
"term": {
"field1": "field1Value"
}
}
]
}
Мой тестовый код:
StringWriter writer = new StringWriter();
MustacheFactory mustacheFactory = new DefaultMustacheFactory();
mustacheFactory.compile(new StringReader(requestTemplate), "templateName").execute(writer, params);
writer.flush();
Приведенный выше код возвращает мне строку шаблона запроса с пустыми строками, заменяющими шаблон.
Возвращенный ответ:
{
"query": {
"bool": {
"filter": ""
}
}
}
Ожидаемый ответ:
{
"query": {
"bool": {
"filter": [
{
"term": {
"field1": "field1Value"
}
}
]
}
}
}
1 ответ
Я наконец нашел решение.
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptEngine;
import org.elasticsearch.script.TemplateScript;
import org.elasticsearch.script.mustache.MustacheScriptEngine;
import java.util.Map;
import static java.util.Collections.singletonMap;
public class CustomMustacheScriptEngine {
private final String JSON_MIME_TYPE_WITH_CHARSET = "application/json; charset=UTF-8";
private final String JSON_MIME_TYPE = "application/json";
private final String PLAIN_TEXT_MIME_TYPE = "text/plain";
private final String X_WWW_FORM_URLENCODED_MIME_TYPE = "application/x-www-form-urlencoded";
private final String DEFAULT_MIME_TYPE = JSON_MIME_TYPE;
private final Map<String, String> params = singletonMap(Script.CONTENT_TYPE_OPTION, JSON_MIME_TYPE_WITH_CHARSET);
public String compile(String jsonScript, final Map<String, Object> scriptParams) {
jsonScript = jsonScript.replaceAll("\"\\{\\{#toJson}}", "{{#toJson}}").replaceAll("\\{\\{/toJson}}\"", "{{/toJson}}");
final ScriptEngine engine = new MustacheScriptEngine();
TemplateScript.Factory compiled = engine.compile("ScriptTemplate", jsonScript, TemplateScript.CONTEXT, params);
TemplateScript executable = compiled.newInstance(scriptParams);
String renderedJsonScript = executable.execute();
return renderedJsonScript;
}
}