Reverse Nested Aggregation

More info about reverse nested aggregation is in the official elasticsearch docs

A special single bucket aggregation that enables aggregating on parent docs from nested documents.

Simple example

{
  "aggregations": {
    "comments": {
      "nested": {
        "path": "comments"
      },
      "aggregations": {
        "top_usernames": {
          "terms": {
            "field": "comments.username"
          },
          "aggregations": {
            "comment_to_issue": {
              "reverse_nested": {},
              "aggregations": {
                "top_tags_per_comment": {
                  "terms": {
                    "field": "tags"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

And now the query via DSL:

$tagsTermsAggregations = new TermsAggregation('top_tags_per_comment', 'tags');

$reverseNestedAggregation = new ReverseNestedAggregation('comment_to_issue');
$reverseNestedAggregation->addAggregation($tagsTermsAggregations);

$usernameTermsAggregation = new TermsAggregation('top_usernames', 'comments.username');
$usernameTermsAggregation->addAggregation($reverseNestedAggregation);

$nestedAggregation = new NestedAggregation('comments', 'comments');
$nestedAggregation->addAggregation($usernameTermsAggregation);

$search = new Search();
$search->addAggregation($nestedAggregation);

$queryArray = $search->toArray();