123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- [[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",
- "message" : "trying out Elasticsearch"
- }'
- --------------------------------------------------
- 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}}
- --------------------------------------------------
- [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`.
- |=======================================================================
- Or, with a request body:
- [source,js]
- --------------------------------------------------
- curl -XGET 'http://localhost:9200/twitter/tweet/_validate/query' -d '{
- "query" : {
- "filtered" : {
- "query" : {
- "query_string" : {
- "query" : "*:*"
- }
- },
- "filter" : {
- "term" : { "user" : "kimchy" }
- }
- }
- }
- }'
- {"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}
- --------------------------------------------------
- NOTE: The query being sent in the body must be nested in a `query` key, same as
- the <<search-search,search api>> works
- If the query is invalid, `valid` will be `false`. Here the query is
- invalid because Elasticsearch knows the post_date field should be a date
- 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,
- "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\""
- } ]
- }
- --------------------------------------------------
- When the query is valid, the explanation defaults to the string
- 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.
|