Arrays of inner object fields do not work the way you may expect.
Lucene has no concept of inner objects, so Elasticsearch flattens object
hierarchies into a simple list of field names and values. For instance, the
following document:

If you need to index arrays of objects and to maintain the independence of
each object in the array, you should use the nested datatype instead of the
object datatype. Internally, nested objects index each object in
the array as a separate hidden document, meaning that each nested object can be
queried independently of the others, with the nested query:

The fields within the nested object, which can be of any
datatype, including nested. New properties
may be added to an existing nested object.

Because nested documents are indexed as separate documents, they can only be
accessed within the scope of the nested query, the
nested/reverse_nested aggregations, or nested inner hits.

For instance, if a string field within a nested document has
index_options set to offsets to allow use of the postings
during the highlighting, these offsets will not be available during the main highlighting
phase. Instead, highlighting needs to be performed via
nested inner hits.

Indexing a document with 100 nested fields actually indexes 101 documents as each nested
document is indexed as a separate document. To safeguard against ill-defined mappings
the number of nested fields that can be defined per index has been limited to 50. See
Settings to prevent mappings explosionedit.

Indexing a document with an array of 100 objects within a nested field, will actually
create 101 documents, as each nested object will be indexed as a separate document.
To prevent out of memory errors when a single document contains too many nested json
objects, the number of nested json objects that a single document may contain across all fields
has been limited to 10000. See Settings to prevent mappings explosionedit.