Search Template APIedit
The search template API allows for searches to be executed from a template based on the mustache language, and also for previewing rendered templates.
Search Template Requestedit
Inline Templatesedit
In the most basic form of request, the search template is specified inline:
SearchTemplateRequest request = new SearchTemplateRequest(); request.setRequest(new SearchRequest("posts")); request.setScriptType(ScriptType.INLINE); request.setScript( "{" + " \"query\": { \"match\" : { \"{{field}}\" : \"{{value}}\" } }," + " \"size\" : \"{{size}}\"" + "}"); Map<String, Object> scriptParams = new HashMap<>(); scriptParams.put("field", "title"); scriptParams.put("value", "elasticsearch"); scriptParams.put("size", 5); request.setScriptParams(scriptParams);
Registered Templatesedit
Search templates can be registered in advance through stored scripts API. Note that the stored scripts API is not yet available in the high-level REST client, so in this example we use the low-level REST client.
Request scriptRequest = new Request("POST", "_scripts/title_search"); scriptRequest.setJsonEntity( "{" + " \"script\": {" + " \"lang\": \"mustache\"," + " \"source\": {" + " \"query\": { \"match\" : { \"{{field}}\" : \"{{value}}\" } }," + " \"size\" : \"{{size}}\"" + " }" + " }" + "}"); Response scriptResponse = restClient.performRequest(scriptRequest);
Instead of providing an inline script, we can refer to this registered template in the request:
SearchTemplateRequest request = new SearchTemplateRequest(); request.setRequest(new SearchRequest("posts")); request.setScriptType(ScriptType.STORED); request.setScript("title_search"); Map<String, Object> params = new HashMap<>(); params.put("field", "title"); params.put("value", "elasticsearch"); params.put("size", 5); request.setScriptParams(params);
Rendering Templatesedit
Given parameter values, a template can be rendered without executing a search:
Both inline and pre-registered templates can be rendered.
Optional Argumentsedit
As in standard search requests, the explain
and profile
options are supported:
request.setExplain(true); request.setProfile(true);
Additional Referencesedit
The Search Template documentation contains further examples of how search requests can be templated.
Synchronous Executionedit
The searchTemplate
method executes the request synchronously:
SearchTemplateResponse response = client.searchTemplate(request, RequestOptions.DEFAULT);
Asynchronous Executionedit
A search template request can be executed asynchronously through the searchTemplateAsync
method:
The asynchronous method does not block and returns immediately. Once the request completes, the
ActionListener
is called back using the onResponse
method if the execution completed successfully,
or using the onFailure
method if it failed.
A typical listener for SearchTemplateResponse
is constructed as follows:
Search Template Responseedit
For a standard search template request, the response contains a SearchResponse
object
with the result of executing the search:
SearchTemplateResponse response = client.searchTemplate(request, RequestOptions.DEFAULT); SearchResponse searchResponse = response.getResponse();
If simulate
was set to true
in the request, then the response
will contain the rendered search source instead of a SearchResponse
: