[[java-rest-high-search-template]] === Search Template API The search template API allows for searches to be executed from a template based on the mustache language, and also for previewing rendered templates. [[java-rest-high-search-template-request]] ==== Search Template Request ===== Inline Templates In the most basic form of request, the search template is specified inline: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-request-inline] -------------------------------------------------- <1> The search is executed against the `posts` index. <2> The template defines the structure of the search source. It is passed as a string because mustache templates are not always valid JSON. <3> Before running the search, the template is rendered with the provided parameters. ===== Registered Templates 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. ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[register-script] -------------------------------------------------- Instead of providing an inline script, we can refer to this registered template in the request: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-request-stored] -------------------------------------------------- ===== Rendering Templates Given parameter values, a template can be rendered without executing a search: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[render-search-template-request] -------------------------------------------------- <1> Setting `simulate` to `true` causes the search template to only be rendered. Both inline and pre-registered templates can be rendered. ===== Optional Arguments As in standard search requests, the `explain` and `profile` options are supported: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-request-options] -------------------------------------------------- ===== Additional References The {ref}/search-template.html[Search Template documentation] contains further examples of how search requests can be templated. [[java-rest-high-search-template-sync]] ==== Synchronous Execution The `searchTemplate` method executes the request synchronously: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-execute] -------------------------------------------------- ==== Asynchronous Execution A search template request can be executed asynchronously through the `searchTemplateAsync` method: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-execute-async] -------------------------------------------------- <1> The `SearchTemplateRequest` to execute and the `ActionListener` to call when the execution completes. 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: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-execute-listener] -------------------------------------------------- <1> Called when the execution is successfully completed. <2> Called when the whole `SearchTemplateRequest` fails. ==== Search Template Response For a standard search template request, the response contains a `SearchResponse` object with the result of executing the search: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[search-template-response] -------------------------------------------------- If `simulate` was set to `true` in the request, then the response will contain the rendered search source instead of a `SearchResponse`: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/SearchDocumentationIT.java[render-search-template-response] -------------------------------------------------- <1> The rendered source in bytes, in our example `{"query": { "match" : { "title" : "elasticsearch" }}, "size" : 5}`.