Skip to content

Latest commit

 

History

History
117 lines (108 loc) · 3.25 KB

32_Nested_query.asciidoc

File metadata and controls

117 lines (108 loc) · 3.25 KB

Querying a Nested Object

Because nested objects are indexed as separate hidden documents, we can’t query them directly. Instead, we have to use the {ref}/query-dsl-nested-query.html[nested query] to access them:

GET /my_index/blogpost/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "eggs" (1)
          }
        },
        {
          "nested": {
            "path": "comments", (2)
            "query": {
              "bool": {
                "must": [ (3)
                  {
                    "match": {
                      "comments.name": "john"
                    }
                  },
                  {
                    "match": {
                      "comments.age": 28
                    }
                  }
                ]
              }
            }
          }
        }
      ]
}}}
  1. The title clause operates on the root document.

  2. The nested clause `steps down'' into the nested `comments field. It no longer has access to fields in the root document, nor fields in any other nested document.

  3. The comments.name and comments.age clauses operate on the same nested document.

Tip

A nested field can contain other nested fields. Similarly, a nested query can contain other nested queries. The nesting hierarchy is applied as you would expect.

Of course, a nested query could match several nested documents. Each matching nested document would have its own relevance score, but these multiple scores need to be reduced to a single score that can be applied to the root document.

By default, it averages the scores of the matching nested documents. This can be controlled by setting the score_mode parameter to avg, max, sum, or even none (in which case the root document gets a constant score of 1.0).

GET /my_index/blogpost/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "eggs"
          }
        },
        {
          "nested": {
            "path": "comments",
            "score_mode": "max", (1)
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "comments.name": "john"
                    }
                  },
                  {
                    "match": {
                      "comments.age": 28
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
  1. Give the root document the _score from the best-matching nested document.

Note

If placed inside the filter clause of a Boolean query, a nested query behaves much like a nested query, except that it doesn’t accept the score_mode parameter. Because it is being used as a non-scoring query — it includes or excludes, but doesn’t score —  a score_mode doesn’t make sense since there is nothing to score.