anchor.diff:  // TESTRESPONSE[s/"_shards": \.\.\./"_shards": $body._shards/]
   // TESTRESPONSE[s/"hits": \.\.\./"hits": $body.hits/]
   
  +[role="child_attributes"]
  +[[adjacency-matrix-agg-params]]
  +==== Parameters
  +
  +`filters`::
  +(Required, object)
  +Filters used to create buckets.
  ++
  +.Properties of `filters`
  +[%collapsible%open]
  +====
  +`<filter>`::
  +(Required, <<query-dsl,Query DSL object>>)
  +Query used to filter documents. The key is the filter name.
  ++
  +At least one filter is required. The total number of filters cannot exceed the
  +<<indices-query-bool-max-clause-count,`indices.query.bool.max_clause_count`>>
  +setting. See <<adjacency-matrix-agg-filter-limits>>.
  +====
  +
  +`separator`::
  +(Optional, string)
  +Separator used to concatenate filter names. Defaults to `&`.
  +
  +[[adjacency-matrix-agg-response]]
  +==== Response body
  +
  +`key`::
  +(string)
  +Filters for the bucket. If the bucket uses multiple filters, filter names are
  +concatenated using a `separator`.
  +
  +`document_count`::
  +(integer)
  +Number of documents matching the bucket's filters.
  +
  +[[adjacency-matrix-agg-usage]]
   ==== Usage
   On its own this aggregation can provide all of the data required to create an undirected weighted graph.
   However, when used with child aggregations such as a `date_histogram` the results can provide the
   additional levels of data required to perform {wikipedia}/Dynamic_network_analysis[dynamic network analysis]
   where examining interactions _over time_ becomes important.
   
  -==== Limitations
  +[[adjacency-matrix-agg-filter-limits]]
  +==== Filter limits
   For N filters the matrix of buckets produced can be N²/2 which can be costly.
   The circuit breaker settings prevent results producing too many buckets and to avoid excessive disk seeks
   the `indices.query.bool.max_clause_count` setting is used to limit the number of filters.
  
positive.code: h|C |    |    |C  
  |=======================
  
  The intersecting buckets e.g `A&C` are labelled using a combination of the two filter names separated by
  the ampersand character. Note that the response does not also include a "C&A" bucket as this would be the
  same set of documents as "A&C". The matrix is said to be _symmetric_ so we only return half of it. To do this we sort 
  the filter name strings and always use the lowest of a pair as the value to the left of the "&" separator. 
  
  An alternative `separator` parameter can be passed in the request if clients wish to use a separator string 
  other than the default of the ampersand.
  
  
  Example:
  
  [source,console,id=adjacency-matrix-aggregation-example]
  --------------------------------------------------
  PUT /emails/_bulk?refresh
  { "index" : { "_id" : 1 } }
  { "accounts" : ["hillary", "sidney"]}
  { "index" : { "_id" : 2 } }
  
negative.code: }
  --------------------------------------------------
  
  The response contains buckets with document counts for each filter and
  combination of filters. Buckets with no matching documents are excluded from the
  response.
  
  [source,console-result]
  --------------------------------------------------
  