Explain API

Explain API

New API reference

For the most up-to-date API details, refer to Search APIs.

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

  1. resp = client.explain(
  2. index="my-index-000001",
  3. id="0",
  4. query={
  5. "match": {
  6. "message": "elasticsearch"
  7. }
  8. },
  9. )
  10. print(resp)
  1. response = client.explain(
  2. index: 'my-index-000001',
  3. id: 0,
  4. body: {
  5. query: {
  6. match: {
  7. message: 'elasticsearch'
  8. }
  9. }
  10. }
  11. )
  12. puts response
  1. const response = await client.explain({
  2. index: "my-index-000001",
  3. id: 0,
  4. query: {
  5. match: {
  6. message: "elasticsearch",
  7. },
  8. },
  9. });
  10. console.log(response);
  1. GET /my-index-000001/_explain/0
  2. {
  3. "query" : {
  4. "match" : { "message" : "elasticsearch" }
  5. }
  6. }

Request

GET /<index>/_explain/<id>

POST /<index>/_explain/<id>

Prerequisites

  • If the Elasticsearch security features are enabled, you must have the read index privilege for the target index.

Description

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.

Path parameters

<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.

Query parameters

analyzer

(Optional, string) Analyzer to use for the query string.

This parameter can only be used when the q query string parameter is specified.

analyze_wildcard

(Optional, Boolean) If true, wildcard and prefix queries are analyzed. Defaults to false.

This parameter can only be used when the q query string parameter is specified.

default_operator

(Optional, string) The default operator for query string query: AND or OR. Defaults to OR.

This parameter can only be used when the q query string parameter is specified.

df

(Optional, string) Field to use as default where no field prefix is given in the query string.

This parameter can only be used when the q query string parameter is specified.

lenient

(Optional, Boolean) If true, format-based query failures (such as providing text to a numeric field) in the query string will be ignored. Defaults to false.

This parameter can only be used when the q query string parameter is specified.

preference

(Optional, string) Specifies the node or shard the operation should be performed on. Random by default.

q

(Optional, string) Query in the Lucene query string syntax.

stored_fields

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

routing

(Optional, string) Custom value used to route operations to a specific shard.

_source

(Optional, string) True or false to return the _source field or not, or a list of fields to return.

_source_excludes

(Optional, string) A comma-separated list of source fields to exclude from the response.

You can also use this parameter to exclude fields from the subset specified in _source_includes query parameter.

If the _source parameter is false, this parameter is ignored.

_source_includes

(Optional, string) A comma-separated list of source fields to include in the response.

If this parameter is specified, only these source fields are returned. You can exclude fields from this subset using the _source_excludes query parameter.

If the _source parameter is false, this parameter is ignored.

Request body

query

(Optional, query object) Defines the search definition using the Query DSL.

Examples

  1. resp = client.explain(
  2. index="my-index-000001",
  3. id="0",
  4. query={
  5. "match": {
  6. "message": "elasticsearch"
  7. }
  8. },
  9. )
  10. print(resp)
  1. response = client.explain(
  2. index: 'my-index-000001',
  3. id: 0,
  4. body: {
  5. query: {
  6. match: {
  7. message: 'elasticsearch'
  8. }
  9. }
  10. }
  11. )
  12. puts response
  1. const response = await client.explain({
  2. index: "my-index-000001",
  3. id: 0,
  4. query: {
  5. match: {
  6. message: "elasticsearch",
  7. },
  8. },
  9. });
  10. console.log(response);
  1. GET /my-index-000001/_explain/0
  2. {
  3. "query" : {
  4. "match" : { "message" : "elasticsearch" }
  5. }
  6. }

The API returns the following response:

  1. {
  2. "_index":"my-index-000001",
  3. "_id":"0",
  4. "matched":true,
  5. "explanation":{
  6. "value":1.6943598,
  7. "description":"weight(message:elasticsearch in 0) [PerFieldSimilarity], result of:",
  8. "details":[
  9. {
  10. "value":1.6943598,
  11. "description":"score(freq=1.0), computed as boost * idf * tf from:",
  12. "details":[
  13. {
  14. "value":2.2,
  15. "description":"boost",
  16. "details":[]
  17. },
  18. {
  19. "value":1.3862944,
  20. "description":"idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
  21. "details":[
  22. {
  23. "value":1,
  24. "description":"n, number of documents containing term",
  25. "details":[]
  26. },
  27. {
  28. "value":5,
  29. "description":"N, total number of documents with field",
  30. "details":[]
  31. }
  32. ]
  33. },
  34. {
  35. "value":0.5555556,
  36. "description":"tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
  37. "details":[
  38. {
  39. "value":1.0,
  40. "description":"freq, occurrences of term within document",
  41. "details":[]
  42. },
  43. {
  44. "value":1.2,
  45. "description":"k1, term saturation parameter",
  46. "details":[]
  47. },
  48. {
  49. "value":0.75,
  50. "description":"b, length normalization parameter",
  51. "details":[]
  52. },
  53. {
  54. "value":3.0,
  55. "description":"dl, length of field",
  56. "details":[]
  57. },
  58. {
  59. "value":5.4,
  60. "description":"avgdl, average length of field",
  61. "details":[]
  62. }
  63. ]
  64. }
  65. ]
  66. }
  67. ]
  68. }
  69. }

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:

  1. resp = client.explain(
  2. index="my-index-000001",
  3. id="0",
  4. q="message:search",
  5. )
  6. print(resp)
  1. response = client.explain(
  2. index: 'my-index-000001',
  3. id: 0,
  4. q: 'message:search'
  5. )
  6. puts response
  1. const response = await client.explain({
  2. index: "my-index-000001",
  3. id: 0,
  4. q: "message:search",
  5. });
  6. console.log(response);
  1. GET /my-index-000001/_explain/0?q=message:search

The API returns the same result as the previous request.