[[query-dsl-has-child-query]]
=== Has Child Query

The `has_child` filter accepts a query and the child type to run against, and
results in parent documents that have child docs matching the query. Here is
an example:

[source,js]
--------------------------------------------------
GET /_search
{
    "query": {
        "has_child" : {
            "type" : "blog_tag",
            "query" : {
                "term" : {
                    "tag" : "something"
                }
            }
        }
    }
}
--------------------------------------------------
// CONSOLE

[float]
==== Scoring capabilities

The `has_child` also has scoring support. The
supported score modes are `min`, `max`, `sum`, `avg` or `none`. The default is
`none` and yields the same behaviour as in previous versions. If the
score mode is set to another value than `none`, the scores of all the
matching child documents are aggregated into the associated parent
documents. The score type can be specified with the `score_mode` field
inside the `has_child` query:

[source,js]
--------------------------------------------------
GET /_search
{
    "query": {
        "has_child" : {
            "type" : "blog_tag",
            "score_mode" : "min",
            "query" : {
                "term" : {
                    "tag" : "something"
                }
            }
        }
    }
}
--------------------------------------------------
// CONSOLE

[float]
==== Min/Max Children

The `has_child` query allows you to specify that a minimum and/or maximum
number of children are required to match for the parent doc to be considered
a match:

[source,js]
--------------------------------------------------
GET /_search
{
    "query": {
        "has_child" : {
            "type" : "blog_tag",
            "score_mode" : "min",
            "min_children": 2, <1>
            "max_children": 10, <1>
            "query" : {
                "term" : {
                    "tag" : "something"
                }
            }
        }
    }
}
--------------------------------------------------
// CONSOLE
<1> Both `min_children` and `max_children` are optional.

The  `min_children` and `max_children` parameters can be combined with
the `score_mode` parameter.

[float]
==== Ignore Unmapped

When set to `true` the `ignore_unmapped` option will ignore an unmapped `type`
and will not match any documents for this query. This can be useful when
querying multiple indexes which might have different mappings. When set to
`false` (the default value) the query will throw an exception if the `type`
is not mapped.

[float]
==== Sorting

Parent documents can't be sorted by fields in matching child documents via the
regular sort options. If you need to sort parent document by field in the child
documents then you can should use the `function_score` query and then just sort
by `_score`.

Sorting blogs by child documents' `click_count` field:

[source,js]
--------------------------------------------------
GET /_search
{
    "query": {
        "has_child" : {
            "type" : "blog_tag",
            "score_mode" : "max",
            "query" : {
                "function_score" : {
                    "script_score": {
                        "script": "_score * doc['click_count'].value"
                    }
                }
            }
        }
    }
}
--------------------------------------------------
// CONSOLE