Has Parent Query

The has_parent query accepts a query and a parent type. The query is executed in the parent document space, which is specified by the parent type. This query returns child documents which associated parents have matched. For the rest has_parent query has the same options and works in the same manner as the has_child query.

GET /_search
{
    "query": {
        "has_parent" : {
            "parent_type" : "blog",
            "query" : {
                "term" : {
                    "tag" : "something"
                }
            }
        }
    }
}

Note that the has_parent is a slow query compared to other queries in the query dsl due to the fact that it performs a join. The performance degrades as the number of matching parent documents increases. 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_parent query that gets added to a search request can increase query time significantly.

Scoring capabilities

The has_parent also has scoring support. The default is false which ignores the score from the parent document. The score is in this case equal to the boost on the has_parent query (Defaults to 1). If the score is set to true, then the score of the matching parent document is aggregated into the child documents belonging to the matching parent document. The score mode can be specified with the score field inside the has_parent query:

GET /_search
{
    "query": {
        "has_parent" : {
            "parent_type" : "blog",
            "score" : true,
            "query" : {
                "term" : {
                    "tag" : "something"
                }
            }
        }
    }
}

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.

Sorting

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

Sorting tags by parent document' view_count field:

GET /_search
{
    "query": {
        "has_parent" : {
            "parent_type" : "blog",
            "score" : true,
            "query" : {
                "function_score" : {
                    "script_score": {
                        "script": "_score * doc['view_count'].value"
                    }
                }
            }
        }
    }
}