2013-08-28 19:24:34 -04:00
|
|
|
[[search-validate]]
|
|
|
|
== Validate API
|
|
|
|
|
|
|
|
The validate API allows a user to validate a potentially expensive query
|
2016-05-10 18:29:56 -04:00
|
|
|
without executing it. We'll use the following test data to explain _validate:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
PUT twitter/tweet/_bulk?refresh
|
|
|
|
{"index":{"_id":1}}
|
|
|
|
{"user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch"}
|
|
|
|
{"index":{"_id":2}}
|
|
|
|
{"user" : "kimchi", "post_date" : "2009-11-15T14:12:13", "message" : "My username is similar to @kimchy!"}
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// CONSOLE
|
|
|
|
// TESTSETUP
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2016-05-10 18:29:56 -04:00
|
|
|
When sent a valid query:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
GET twitter/_validate/query?q=user:foo
|
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
|
|
|
|
The response contains `valid:true`:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// TESTRESPONSE
|
2013-08-28 19:24:34 -04:00
|
|
|
|
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.
|
|
|
|
|
|
|
|
|`analyze_wildcard` |Should wildcard and prefix queries be analyzed or
|
|
|
|
not. Defaults to `false`.
|
|
|
|
|=======================================================================
|
|
|
|
|
2016-05-10 18:29:56 -04:00
|
|
|
The query may also be sent in the request body:
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
GET twitter/tweet/_validate/query
|
|
|
|
{
|
2014-02-13 05:30:13 -05:00
|
|
|
"query" : {
|
2015-09-11 04:35:56 -04:00
|
|
|
"bool" : {
|
|
|
|
"must" : {
|
2014-02-13 05:30:13 -05:00
|
|
|
"query_string" : {
|
|
|
|
"query" : "*:*"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"filter" : {
|
|
|
|
"term" : { "user" : "kimchy" }
|
2013-08-28 19:24:34 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-05-10 18:29:56 -04:00
|
|
|
}
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// CONSOLE
|
2013-08-28 19:24:34 -04:00
|
|
|
|
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]
|
|
|
|
--------------------------------------------------
|
2016-11-08 18:47:50 -05:00
|
|
|
GET twitter/tweet/_validate/query
|
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"query_string": {
|
|
|
|
"query": "post_date:foo",
|
|
|
|
"lenient": false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-05-10 18:29:56 -04:00
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2013-08-28 19:24:34 -04:00
|
|
|
{"valid":false,"_shards":{"total":1,"successful":1,"failed":0}}
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// TESTRESPONSE
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
An `explain` parameter can be specified to get more detailed information
|
|
|
|
about why a query failed:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-11-08 18:47:50 -05:00
|
|
|
GET twitter/tweet/_validate/query?explain=true
|
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"query_string": {
|
|
|
|
"query": "post_date:foo",
|
|
|
|
"lenient": false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-05-10 18:29:56 -04:00
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
|
|
|
|
responds with:
|
|
|
|
|
2016-08-29 17:33:25 -04:00
|
|
|
[source,js]
|
2016-05-10 18:29:56 -04:00
|
|
|
--------------------------------------------------
|
2013-08-28 19:24:34 -04:00
|
|
|
{
|
|
|
|
"valid" : false,
|
|
|
|
"_shards" : {
|
|
|
|
"total" : 1,
|
|
|
|
"successful" : 1,
|
|
|
|
"failed" : 0
|
|
|
|
},
|
|
|
|
"explanations" : [ {
|
|
|
|
"index" : "twitter",
|
|
|
|
"valid" : false,
|
2016-05-10 18:29:56 -04:00
|
|
|
"error" : "twitter/IAEc2nIXSSunQA_suI0MLw] QueryShardException[failed to create query:...failed to parse date field [foo]"
|
2013-08-28 19:24:34 -04:00
|
|
|
} ]
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// TESTRESPONSE[s/"error" : "[^\"]+"/"error": "$body.explanations.0.error"/]
|
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.
|
|
|
|
|
2017-03-22 17:39:21 -04:00
|
|
|
For More Like This:
|
2015-03-18 15:28:20 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
GET twitter/tweet/_validate/query?rewrite=true
|
2015-03-18 15:28:20 -04:00
|
|
|
{
|
|
|
|
"query": {
|
2017-03-22 17:39:21 -04:00
|
|
|
"more_like_this": {
|
|
|
|
"like": {
|
|
|
|
"_id": "2"
|
|
|
|
},
|
|
|
|
"boost_terms": 1
|
2015-03-18 15:28:20 -04:00
|
|
|
}
|
|
|
|
}
|
2016-05-10 18:29:56 -04:00
|
|
|
}
|
2015-03-18 15:28:20 -04:00
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// CONSOLE
|
2017-03-22 17:39:21 -04:00
|
|
|
// TEST[skip:the output is randomized depending on which shard we hit]
|
2015-03-18 15:28:20 -04:00
|
|
|
|
|
|
|
Response:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"valid": true,
|
|
|
|
"_shards": {
|
|
|
|
"total": 1,
|
|
|
|
"successful": 1,
|
|
|
|
"failed": 0
|
|
|
|
},
|
|
|
|
"explanations": [
|
|
|
|
{
|
2016-05-10 18:29:56 -04:00
|
|
|
"index": "twitter",
|
2015-03-18 15:28:20 -04:00
|
|
|
"valid": true,
|
2017-03-22 17:39:21 -04:00
|
|
|
"explanation": "((user: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:tweet#2)) #(ConstantScore(_type:tweet))^0.0"
|
2015-03-18 15:28:20 -04:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// TESTRESPONSE
|
2015-03-18 15:28:20 -04:00
|
|
|
|
2017-03-22 17:39:21 -04:00
|
|
|
By default, 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. So, in case of
|
|
|
|
query rewrite the `all_shards` parameter should be used to get response from
|
|
|
|
all available shards.
|
|
|
|
|
|
|
|
For Fuzzy Queries:
|
2015-03-18 15:28:20 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
2017-03-22 17:39:21 -04:00
|
|
|
GET twitter/tweet/_validate/query?rewrite=true&all_shards=true
|
2015-03-18 15:28:20 -04:00
|
|
|
{
|
|
|
|
"query": {
|
2017-03-22 17:39:21 -04:00
|
|
|
"match": {
|
|
|
|
"user": {
|
|
|
|
"query": "kimchy",
|
|
|
|
"fuzziness": "auto"
|
|
|
|
}
|
2015-03-18 15:28:20 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// CONSOLE
|
2015-03-18 15:28:20 -04:00
|
|
|
|
|
|
|
Response:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
2017-03-22 17:39:21 -04:00
|
|
|
"valid": true,
|
|
|
|
"_shards": {
|
|
|
|
"total": 5,
|
|
|
|
"successful": 5,
|
|
|
|
"failed": 0
|
|
|
|
},
|
|
|
|
"explanations": [
|
|
|
|
{
|
|
|
|
"index": "twitter",
|
|
|
|
"shard": 0,
|
|
|
|
"valid": true,
|
|
|
|
"explanation": "+MatchNoDocsQuery(\"empty BooleanQuery\") #ConstantScore(MatchNoDocsQuery(\"empty BooleanQuery\"))"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"index": "twitter",
|
|
|
|
"shard": 1,
|
|
|
|
"valid": true,
|
|
|
|
"explanation": "+MatchNoDocsQuery(\"empty BooleanQuery\") #ConstantScore(MatchNoDocsQuery(\"empty BooleanQuery\"))"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"index": "twitter",
|
|
|
|
"shard": 2,
|
|
|
|
"valid": true,
|
|
|
|
"explanation": "(user:kimchi)^0.8333333"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"index": "twitter",
|
|
|
|
"shard": 3,
|
|
|
|
"valid": true,
|
|
|
|
"explanation": "user:kimchy"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"index": "twitter",
|
|
|
|
"shard": 4,
|
|
|
|
"valid": true,
|
|
|
|
"explanation": "+MatchNoDocsQuery(\"empty BooleanQuery\") #ConstantScore(MatchNoDocsQuery(\"empty BooleanQuery\"))"
|
|
|
|
}
|
|
|
|
]
|
2015-03-18 15:28:20 -04:00
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-05-10 18:29:56 -04:00
|
|
|
// TESTRESPONSE
|