Pass-through object field type
Elastic Cloud Serverless projects are autoscaled environments, fully managed by Elastic and available on Elastic Cloud. Availability This functionality is generally available and ready for production usage. Serverless interfaces and procedures might differ from classic Elastic Stack deployments. The Elastic Stack includes Elastic's core products such as Elasticsearch, Kibana, Logstash, and Beats. Availability This functionality is generally available and ready for production usage. Unless stated otherwise on the page, this functionality is available when your Elastic Stack is deployed on Elastic Cloud Hosted, Elastic Cloud Enterprise, Elastic Cloud on Kubernetes, and self-managed environments. This documentation corresponds to the latest patch available for each minor version. If you're not using the latest patch, check the release notes for changes.
Serverless
Generally available
Stack
Generally available
Pass-through objects extend the functionality of objects by allowing to access their subfields without including the name of the pass-through object as prefix. For instance:
PUT my-index-000001{ "mappings": { "properties": { "attributes": { "type": "passthrough", "priority": 10, "properties": { "id": { "type": "keyword" } } } } } }PUT my-index-000001/_doc/1{ "attributes" : { "id": "foo", "zone": 10 } }GET my-index-000001/_search{ "query": { "bool": { "must": [ { "match": { "id": "foo" }}, { "match": { "zone": 10 }} ] } } }GET my-index-000001/_search{ "query": { "bool": { "must": [ { "match": { "attributes.id": "foo" }}, { "match": { "attributes.zone": 10 }} ] } } }
- An object is defined as pass-through. Its priority (required) is used for conflict resolution.
- Object contents get indexed as usual, including dynamic mappings.
- Sub-fields can be referenced in queries as if they’re defined at the root level.
- Sub-fields can also be referenced including the object name as prefix.
It’s possible for conflicting names to arise, for fields that are defined within different scopes:
A pass-through object is defined next to a field that has the same name as one of the pass-through object sub-fields, e.g.
JSON PUT my-index-000001/_doc/1{ "attributes" : { "id": "foo" }, "id": "bar" }In this case, references to
idpoint to the field at the root level, while fieldattributes.idcan only be accessed using the full path.Two (or more) pass-through objects are defined within the same object and contain fields with the same name, e.g.
JSON PUT my-index-000002{ "mappings": { "properties": { "attributes": { "type": "passthrough", "priority": 10, "properties": { "id": { "type": "keyword" } } }, "resource.attributes": { "type": "passthrough", "priority": 20, "properties": { "id": { "type": "keyword" } } } } } }In this case, param
priorityis used for conflict resolution, with the higher values taking precedence. In the example above,resource.attributeshas higher priority thanattributes, so references toidpoint to the field withinresource.attributes.attributes.idcan still be accessed using its full path.
It is possible to configure a pass-through field as a container for time-series dimensions. In this case, all sub-fields get annotated with the same parameter under the covers, and they’re also included in routing path and tsid calculations, thus simplifying the TSDS setup:
PUT _index_template/my-metrics{ "index_patterns": ["metrics-mymetrics-*"], "priority": 200, "data_stream": { }, "template": { "settings": { "index.mode": "time_series" }, "mappings": { "properties": { "attributes": { "type": "passthrough", "priority": 10, "time_series_dimension": true, "properties": { "host.name": { "type": "keyword" } } }, "cpu": { "type": "integer", "time_series_metric": "counter" } } } } }POST metrics-mymetrics-test/_doc{ "@timestamp": "2020-01-01T00:00:00.000Z", "attributes" : { "host.name": "foo", "zone": "bar" }, "cpu": 10 }
In the example above, attributes is defined as a dimension container. Its sub-fields host.name (static) and zone (dynamic) get included in the routing path and tsid, and can be referenced in queries without the attributes. prefix.
Pass-through fields apply auto-flattening to sub-fields by default, to reduce dynamic mapping conflicts. As a consequence, no sub-object definitions are allowed within pass-through fields.
The following parameters are accepted by passthrough fields:
priority- (Required) used for naming conflict resolution between pass-through fields. The field with the highest value wins. Accepts non-negative integer values.
time_series_dimension- Whether or not to treat sub-fields as time-series dimensions. Accepts
false(default) ortrue. dynamic- Whether or not new
propertiesshould be added dynamically to an existing object. Acceptstrue(default),runtime,falseandstrict. enabled- Whether the JSON value given for the object field should be parsed and indexed (
true, default) or completely ignored (false). properties- The fields within the object, which can be of any data type, including
object. New properties may be added to an existing object.
If you need to index arrays of objects instead of single objects, read Nested first.