| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | [[query-dsl-has-child-query]]=== Has Child QueryThe `has_child` filter accepts a query and the child type to run against, andresults in parent documents that have child docs matching the query. Here isan example:[source,js]--------------------------------------------------GET /_search{    "query": {        "has_child" : {            "type" : "blog_tag",            "query" : {                "term" : {                    "tag" : "something"                }            }        }    }}--------------------------------------------------// CONSOLENote that the `has_child` is a slow query compared to other queries in thequery dsl due to the fact that it performs a join. The performance degradesas the number of matching child documents pointing to unique parent documentsincreases. If you care about query performance you should not use this query.However if you do happen to use this query then use it as less as possible. Each`has_child` query that gets added to a search request can increase query timesignificantly.[float]==== Scoring capabilitiesThe `has_child` also has scoring support. Thesupported score modes are `min`, `max`, `sum`, `avg` or `none`. The default is`none` and yields the same behaviour as in previous versions. If thescore mode is set to another value than `none`, the scores of all thematching child documents are aggregated into the associated parentdocuments. The score type can be specified with the `score_mode` fieldinside 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 ChildrenThe `has_child` query allows you to specify that a minimum and/or maximumnumber of children are required to match for the parent doc to be considereda 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 withthe `score_mode` parameter.[float]==== Ignore UnmappedWhen 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 whenquerying 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]==== SortingParent documents can't be sorted by fields in matching child documents via theregular sort options. If you need to sort parent document by field in the childdocuments then you can should use the `function_score` query and then just sortby `_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
 |