- 
                Notifications
    You must be signed in to change notification settings 
- Fork 25.6k
Description
Often we have large object fields with many sub-fields, only a few of which are needed for aggregations, sorting, or highlighting. Today, we create fields for all sub-fields, but we could greatly reduce the number of required fields if we make object fields queryable.
We would need a specialiased analyzer which can accept JSON and transform an object like:
{
    "status": "active",
    "age": 25,
    "city": "New York"
}
into the following terms:
"status:active", "age:25", "city:new", "city:york"
Then you could search for active statuses with:
{
  "match": {
    "my_object": "status:active"
  }
}
or
{
  "query_string": {
    "query": "my_object:\"status:active\""
  }
}
We could possibly even support searching for "New York" vs "New City of York" with:
{
  "match_phrase": {
    "my_object": "New York"
  }
}
which would be rewritten as my_object:"city:new city:york"
If we wanted to be able to aggregate on the age  field, the object field could be mapped as:
{
  "my_object": {
    "type": "object",
    "index": true,
    "dynamic": false,
    "properties": {
      "age": {
        "type": "integer"
      }
    }
  }
}
With this mapping, only the my_object.age sub-field would have its own Lucene field (or Elasticsearch field) and the rest of the object would be queryable via the my_object field.
This could even be made to work on the whole document by allowing the _source field to be configurable.