2013-08-28 19:24:34 -04:00
[[search-validate]]
== Validate API
The validate API allows a user to validate a potentially expensive query
without executing it. The following example shows how it can be used:
[source,js]
--------------------------------------------------
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
2014-01-06 15:58:46 -05:00
"message" : "trying out Elasticsearch"
2013-08-28 19:24:34 -04:00
}'
--------------------------------------------------
When the query is valid, the response contains `valid:true`:
[source,js]
--------------------------------------------------
curl -XGET 'http://localhost:9200/twitter/_validate/query?q=user:foo'
{"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}
--------------------------------------------------
2015-05-11 06:58:12 -04:00
[float]
=== Request Parameters
When executing exists using the query parameter `q`, the query passed is
a query string using Lucene query parser. There are additional
parameters that can be passed:
[cols="<,<",options="header",]
|=======================================================================
|Name |Description
|`df` |The default field to use when no field prefix is defined within the
query.
|`analyzer` |The analyzer name to be used when analyzing the query string.
|`default_operator` |The default operator to be used, can be `AND` or
`OR`. Defaults to `OR`.
|`lenient` |If set to true will cause format based failures (like
providing text to a numeric field) to be ignored. Defaults to false.
|`lowercase_expanded_terms` |Should terms be automatically lowercased or
not. Defaults to `true`.
|`analyze_wildcard` |Should wildcard and prefix queries be analyzed or
not. Defaults to `false`.
|=======================================================================
2013-08-28 19:24:34 -04:00
Or, with a request body:
[source,js]
--------------------------------------------------
curl -XGET 'http://localhost:9200/twitter/tweet/_validate/query' -d '{
2014-02-13 05:30:13 -05:00
"query" : {
"filtered" : {
"query" : {
"query_string" : {
"query" : "*:*"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
2013-08-28 19:24:34 -04:00
}
}
}
}'
{"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}
--------------------------------------------------
2014-02-13 05:30:13 -05:00
NOTE: The query being sent in the body must be nested in a `query` key, same as
2014-09-26 15:04:42 -04:00
the <<search-search,search api>> works
2014-02-13 05:30:13 -05:00
2013-08-28 19:24:34 -04:00
If the query is invalid, `valid` will be `false`. Here the query is
2014-01-06 15:58:46 -05:00
invalid because Elasticsearch knows the post_date field should be a date
2013-08-28 19:24:34 -04:00
due to dynamic mapping, and 'foo' does not correctly parse into a date:
[source,js]
--------------------------------------------------
curl -XGET 'http://localhost:9200/twitter/tweet/_validate/query?q=post_date:foo'
{"valid":false,"_shards":{"total":1,"successful":1,"failed":0}}
--------------------------------------------------
An `explain` parameter can be specified to get more detailed information
about why a query failed:
[source,js]
--------------------------------------------------
curl -XGET 'http://localhost:9200/twitter/tweet/_validate/query?q=post_date:foo&pretty=true&explain=true'
{
"valid" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"explanations" : [ {
"index" : "twitter",
"valid" : false,
2014-01-06 15:58:46 -05:00
"error" : "org.elasticsearch.index.query.QueryParsingException: [twitter] Failed to parse; org.elasticsearch.ElasticsearchParseException: failed to parse date field [foo], tried both date format [dateOptionalTime], and timestamp number; java.lang.IllegalArgumentException: Invalid format: \"foo\""
2013-08-28 19:24:34 -04:00
} ]
}
--------------------------------------------------
2015-03-18 15:28:20 -04:00
2015-08-14 04:51:09 -04:00
When the query is valid, the explanation defaults to the string
2015-03-18 15:28:20 -04:00
representation of that query. With `rewrite` set to `true`, the explanation
is more detailed showing the actual Lucene query that will be executed.
For Fuzzy Queries:
[source,js]
--------------------------------------------------
curl -XGET 'http://localhost:9200/imdb/movies/_validate/query?rewrite=true'
{
"query": {
"fuzzy": {
"actors": "kyle"
}
}
}
--------------------------------------------------
Response:
[source,js]
--------------------------------------------------
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "imdb",
"valid": true,
"explanation": "filtered(plot:kyle plot:kylie^0.75 plot:kyne^0.75 plot:lyle^0.75 plot:pyle^0.75)->cache(_type:movies)"
}
]
}
--------------------------------------------------
For More Like This:
[source,js]
--------------------------------------------------
curl -XGET 'http://localhost:9200/imdb/movies/_validate/query?rewrite=true'
{
"query": {
"more_like_this": {
"like": {
"_id": "88247"
},
"boost_terms": 1
}
}
}
--------------------------------------------------
Response:
[source,js]
--------------------------------------------------
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "imdb",
"valid": true,
"explanation": "filtered(((title:terminator^3.71334 plot:future^2.763601 plot:human^2.8415773 plot:sarah^3.4193945 plot:kyle^3.8244398 plot:cyborg^3.9177752 plot:connor^4.040236 plot:reese^4.7133346 ... )~6) -ConstantScore(_uid:movies#88247))->cache(_type:movies)"
}
]
}
--------------------------------------------------
CAUTION: The request is executed on a single shard only, which is randomly
selected. The detailed explanation of the query may depend on which shard is
being hit, and therefore may vary from one request to another.