2014-01-24 06:27:00 -05:00
|
|
|
[[query-dsl-template-query]]
|
|
|
|
=== Template Query
|
|
|
|
|
|
|
|
A query that accepts a query template and a map of key/value pairs to fill in
|
2015-01-28 08:19:52 -05:00
|
|
|
template parameters. Templating is based on Mustache. For simple token substitution all you provide
|
|
|
|
is a query containing some variable that you want to substitute and the actual
|
|
|
|
values:
|
2014-01-24 06:27:00 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
------------------------------------------
|
2014-03-17 06:30:47 -04:00
|
|
|
GET /_search
|
2014-01-24 06:27:00 -05:00
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"template": {
|
Mustache tags syntax
Hi there. I've been experimenting with the search templates recently and I'm a bit confused. Shouldn't the Mustache tags be written like `{{tagname}}` instead of `{tagname}`? Your using `{{...}}` [here](http://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html) BTW.
Using the first example in that page seems to indicate that something's wrong, or am I missing something?
```
$ curl 'localhost:9200/test/_search' -d '{"query":{"template":{"query":{"match":{"text":"{keywords}"}},"params":{"keywords":"value1_foo"}}}}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
$ curl 'localhost:9200/test/_search' -d '{"query":{"template":{"query":{"match":{"text":"{{keywords}}"}},"params":{"keywords":"value1_foo"}}}}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"test","_type":"testtype","_id":"1","_score":1.0,"_source":{"text":"value1_foo"}}]}}
```
2015-04-24 03:41:12 -04:00
|
|
|
"query": { "match": { "text": "{{query_string}}" }}},
|
2014-01-24 06:27:00 -05:00
|
|
|
"params" : {
|
2015-01-28 08:19:52 -05:00
|
|
|
"query_string" : "all about search"
|
2014-01-24 06:27:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
------------------------------------------
|
|
|
|
|
2015-01-28 08:19:52 -05:00
|
|
|
The above request is translated into:
|
2014-01-24 06:27:00 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
------------------------------------------
|
2014-03-17 06:30:47 -04:00
|
|
|
GET /_search
|
2014-01-24 06:27:00 -05:00
|
|
|
{
|
|
|
|
"query": {
|
2015-01-28 08:19:52 -05:00
|
|
|
"match": {
|
|
|
|
"text": "all about search"
|
2014-01-24 06:27:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-28 08:19:52 -05:00
|
|
|
------------------------------------------
|
2014-01-24 06:27:00 -05:00
|
|
|
|
2015-01-28 08:19:52 -05:00
|
|
|
Alternatively passing the template as an escaped string works as well:
|
2014-01-24 06:27:00 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
------------------------------------------
|
2014-03-17 06:30:47 -04:00
|
|
|
GET /_search
|
2014-01-24 06:27:00 -05:00
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"template": {
|
Mustache tags syntax
Hi there. I've been experimenting with the search templates recently and I'm a bit confused. Shouldn't the Mustache tags be written like `{{tagname}}` instead of `{tagname}`? Your using `{{...}}` [here](http://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html) BTW.
Using the first example in that page seems to indicate that something's wrong, or am I missing something?
```
$ curl 'localhost:9200/test/_search' -d '{"query":{"template":{"query":{"match":{"text":"{keywords}"}},"params":{"keywords":"value1_foo"}}}}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
$ curl 'localhost:9200/test/_search' -d '{"query":{"template":{"query":{"match":{"text":"{{keywords}}"}},"params":{"keywords":"value1_foo"}}}}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"test","_type":"testtype","_id":"1","_score":1.0,"_source":{"text":"value1_foo"}}]}}
```
2015-04-24 03:41:12 -04:00
|
|
|
"query": "{ \"match\": { \"text\": \"{{query_string}}\" }}}", <1>
|
2014-01-24 06:27:00 -05:00
|
|
|
"params" : {
|
2015-01-28 08:19:52 -05:00
|
|
|
"query_string" : "all about search"
|
2014-01-24 06:27:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
------------------------------------------
|
2015-01-28 08:19:52 -05:00
|
|
|
<1> New line characters (`\n`) should be escaped as `\\n` or removed,
|
|
|
|
and quotes (`"`) should be escaped as `\\"`.
|
2014-01-24 06:27:00 -05:00
|
|
|
|
2015-01-28 08:19:52 -05:00
|
|
|
==== Stored templates
|
|
|
|
|
|
|
|
You can register a template by storing it in the `config/scripts` directory, in a file using the `.mustache` extension.
|
|
|
|
In order to execute the stored template, reference it by name in the `file`
|
|
|
|
parameter:
|
2014-01-24 06:27:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
------------------------------------------
|
2014-03-17 06:30:47 -04:00
|
|
|
GET /_search
|
2014-01-24 06:27:00 -05:00
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"template": {
|
2015-01-28 08:19:52 -05:00
|
|
|
"file": "my_template", <1>
|
2014-01-24 06:27:00 -05:00
|
|
|
"params" : {
|
2015-01-28 08:19:52 -05:00
|
|
|
"query_string" : "all about search"
|
2014-01-24 06:27:00 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
------------------------------------------
|
2015-01-28 08:19:52 -05:00
|
|
|
<1> Name of the the query template in `config/scripts/`, i.e., `my_template.mustache`.
|
2014-01-24 06:27:00 -05:00
|
|
|
|
2015-01-28 08:19:52 -05:00
|
|
|
Alternatively, you can register a query template in the special `.scripts` index with:
|
2014-01-24 06:27:00 -05:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
------------------------------------------
|
2015-01-28 08:19:52 -05:00
|
|
|
PUT /_search/template/my_template
|
2014-01-24 06:27:00 -05:00
|
|
|
{
|
Mustache tags syntax
Hi there. I've been experimenting with the search templates recently and I'm a bit confused. Shouldn't the Mustache tags be written like `{{tagname}}` instead of `{tagname}`? Your using `{{...}}` [here](http://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html) BTW.
Using the first example in that page seems to indicate that something's wrong, or am I missing something?
```
$ curl 'localhost:9200/test/_search' -d '{"query":{"template":{"query":{"match":{"text":"{keywords}"}},"params":{"keywords":"value1_foo"}}}}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
$ curl 'localhost:9200/test/_search' -d '{"query":{"template":{"query":{"match":{"text":"{{keywords}}"}},"params":{"keywords":"value1_foo"}}}}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"test","_type":"testtype","_id":"1","_score":1.0,"_source":{"text":"value1_foo"}}]}}
```
2015-04-24 03:41:12 -04:00
|
|
|
"template": { "match": { "text": "{{query_string}}" }}},
|
2014-03-17 06:30:47 -04:00
|
|
|
}
|
|
|
|
------------------------------------------
|
|
|
|
|
2015-01-28 08:19:52 -05:00
|
|
|
and refer to it in the `template` query with the `id` parameter:
|
2014-07-16 05:46:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
------------------------------------------
|
|
|
|
GET /_search
|
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"template": {
|
2015-01-28 08:19:52 -05:00
|
|
|
"id": "my_template", <1>
|
2014-07-16 05:46:55 -04:00
|
|
|
"params" : {
|
2015-01-28 08:19:52 -05:00
|
|
|
"query_string" : "all about search"
|
2014-07-16 05:46:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
------------------------------------------
|
2015-01-28 08:19:52 -05:00
|
|
|
<1> Name of the the query template in `config/scripts/`, i.e., `storedTemplate.mustache`.
|
2014-07-16 05:46:55 -04:00
|
|
|
|
|
|
|
|
2014-03-25 10:24:31 -04:00
|
|
|
There is also a dedicated `template` endpoint, allows you to template an entire search request.
|
|
|
|
Please see <<search-template>> for more details.
|
2014-01-24 06:27:00 -05:00
|
|
|
|