Использование Mustache API для анализа запросов Elasticsearch JSON Template - PullRequest
0 голосов
/ 11 июля 2020

Я использовал класс 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 Ответ

0 голосов
/ 12 июля 2020

Наконец-то я нашел решение.

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;
    }
}
...