.. _es-guide-reference-api-validate:

========
Validate
========

The validate API allows a user to validate a potentially expensive query without executing it. The following example shows how it can be used:


.. code-block:: js

    curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
        "user" : "kimchy",
        "post_date" : "2009-11-15T14:12:12",
        "message" : "trying out Elastic Search"
    }'
    


When the query is valid, the response contains **valid:true**:

.. code-block:: js

    curl -XGET 'http://localhost:9200/twitter/_validate/query?q=user:foo'
    {"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}


Or, with a request body:

.. code-block:: js

    curl -XGET 'http://localhost:9200/twitter/tweet/_validate/query' -d '{
      "filtered" : {
        "query" : {
          "query_string" : {
            "query" : "*:*"
          }
        },
        "filter" : {
          "term" : { "user" : "kimchy" }
        }
      }
    }'
    {"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}


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:

.. code-block:: 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:

.. code-block:: 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\""
      } ]
    }

