[[joining-queries]]
== Joining queries

Performing full SQL-style joins in a distributed system like Elasticsearch is
prohibitively expensive. Instead, Elasticsearch offers two forms of join
which are designed to scale horizontally.

<<query-dsl-nested-query,`nested` query>>::
Documents may contain fields of type <<nested,`nested`>>. These
fields are used to index arrays of objects, where each object can be queried
(with the `nested` query) as an independent document.

<<query-dsl-has-child-query,`has_child`>> and <<query-dsl-has-parent-query,`has_parent`>> queries::
A <<parent-join,`join` field relationship>> can exist between
documents within a single index. The `has_child` query returns parent
documents whose child documents match the specified query, while the
`has_parent` query returns child documents whose parent document matches the
specified query.

Also see the <<query-dsl-terms-lookup,terms-lookup mechanism>> in the `terms`
query, which allows you to build a `terms` query from values contained in
another document.

[discrete]
[[joining-queries-notes]]
==== Notes

[discrete]
===== Allow expensive queries
Joining queries will not be executed if <<query-dsl-allow-expensive-queries, `search.allow_expensive_queries`>>
is set to false.

include::nested-query.asciidoc[]

include::has-child-query.asciidoc[]

include::has-parent-query.asciidoc[]

include::parent-id-query.asciidoc[]


