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.