[[search-explain]]
=== Explain API
++++
<titleabbrev>Explain</titleabbrev>
++++

Returns information about why a specific document matches (or doesn't match) a 
query.

[source,console]
--------------------------------------------------
GET /my-index-000001/_explain/0
{
  "query" : {
    "match" : { "message" : "elasticsearch" }
  }
}
--------------------------------------------------
// TEST[setup:messages]


[[search-explain-api-request]]
==== {api-request-title}

`GET /<index>/_explain/<id>`

`POST /<index>/_explain/<id>`

[[search-explain-api-prereqs]]
==== {api-prereq-title}

* If the {es} {security-features} are enabled, you must have the `read`
<<privileges-list-indices,index privilege>> for the target index.

[[search-explain-api-desc]]
==== {api-description-title}

The explain API computes a score explanation for a query and a specific
document. This can give useful feedback whether a document matches or
didn't match a specific query.


[[search-explain-api-path-params]]
==== {api-path-parms-title}

`<id>`::
  (Required, integer) Defines the document ID.
  
`<index>`::
+
--
(Required, string)
Index names used to limit the request.

Only a single index name can be provided to this parameter.
--


[[search-explain-api-query-params]]
==== {api-query-parms-title}

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=analyzer]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=analyze_wildcard]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=default_operator]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=df]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=lenient]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=preference]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=search-q]

`stored_fields`::
  (Optional, string) A comma-separated list of stored fields to return in the 
  response.

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=routing]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=source]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=source_excludes]

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=source_includes]


[[search-explain-api-request-body]]
==== {api-request-body-title}

include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=query]


[[search-explain-api-example]]
==== {api-examples-title}

[source,console]
--------------------------------------------------
GET /my-index-000001/_explain/0
{
  "query" : {
    "match" : { "message" : "elasticsearch" }
  }
}
--------------------------------------------------
// TEST[setup:messages]


The API returns the following response:

[source,console-result]
--------------------------------------------------
{
   "_index":"my-index-000001",
   "_type":"_doc",
   "_id":"0",
   "matched":true,
   "explanation":{
      "value":1.6943598,
      "description":"weight(message:elasticsearch in 0) [PerFieldSimilarity], result of:",
      "details":[
         {
            "value":1.6943598,
            "description":"score(freq=1.0), computed as boost * idf * tf from:",
            "details":[
               {
                  "value":2.2,
                  "description":"boost",
                  "details":[]
               },
               {
                  "value":1.3862944,
                  "description":"idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details":[
                     {
                        "value":1,
                        "description":"n, number of documents containing term",
                        "details":[]
                     },
                     {
                        "value":5,
                        "description":"N, total number of documents with field",
                        "details":[]
                     }
                  ]
               },
               {
                  "value":0.5555556,
                  "description":"tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details":[
                     {
                        "value":1.0,
                        "description":"freq, occurrences of term within document",
                        "details":[]
                     },
                     {
                        "value":1.2,
                        "description":"k1, term saturation parameter",
                        "details":[]
                     },
                     {
                        "value":0.75,
                        "description":"b, length normalization parameter",
                        "details":[]
                     },
                     {
                        "value":3.0,
                        "description":"dl, length of field",
                        "details":[]
                     },
                     {
                        "value":5.4,
                        "description":"avgdl, average length of field",
                        "details":[]
                     }
                  ]
               }
            ]
         }
      ]
   }
}
--------------------------------------------------


There is also a simpler way of specifying the query via the `q` parameter. The 
specified `q` parameter value is then parsed as if the `query_string` query was 
used. Example usage of the `q` parameter in the
explain API:

[source,console]
--------------------------------------------------
GET /my-index-000001/_explain/0?q=message:search
--------------------------------------------------
// TEST[setup:messages]


The API returns the same result as the previous request.
