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