To better understand how to search through array data in your ElasticSearch JSON document, it is important to know how ElasticSearch stores arrays behind the scenes.   Given a document which contains a ‘names’ array with a list of different name properties(e.g. firstname, lastname,…) using the following mapping:    With the following sample data:    When ElasticSearch indexes this document, it is stored like this:    Lucene has no concept of inner objects, so Elasticsearch flattens object hierarchies into a simple list of field names and values.   If you don’t want this behavior, you have to map the array as a nested object . Internally ElasticSearch maps these array objects as separate documents and does a child query.