Example: Enrich your data based on geolocation
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
geo_match enrich policies match enrich data to incoming documents based on a geographic location, using a geo_shape query.
The following example creates a geo_match enrich policy that adds postal codes to incoming documents based on a set of coordinates. It then adds the geo_match enrich policy to a processor in an ingest pipeline.
Use the create index API to create a source index containing at least one geo_shape field.
PUT /postal_codes{ "mappings": { "properties": { "location": { "type": "geo_shape" }, "postal_code": { "type": "keyword" } } } }
Use the index API to index enrich data to this source index.
PUT /postal_codes/_doc/1?refresh=wait_for{ "location": { "type": "envelope", "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ] }, "postal_code": "96598" }
Use the create enrich policy API to create an enrich policy with the geo_match policy type. This policy must include:
- One or more source indices
- A
match_field, thegeo_shapefield from the source indices used to match incoming documents - Enrich fields from the source indices you’d like to append to incoming documents
PUT /_enrich/policy/postal_policy{ "geo_match": { "indices": "postal_codes", "match_field": "location", "enrich_fields": [ "location", "postal_code" ] } }
Use the execute enrich policy API to create an enrich index for the policy.
POST /_enrich/policy/postal_policy/_execute?wait_for_completion=false
Use the create or update pipeline API to create an ingest pipeline. In the pipeline, add an enrich processor that includes:
- Your enrich policy.
- The
fieldof incoming documents used to match the geoshape of documents from the enrich index. - The
target_fieldused to store appended enrich data for incoming documents. This field contains thematch_fieldandenrich_fieldsspecified in your enrich policy. - The
shape_relation, which indicates how the processor matches geoshapes in incoming documents to geoshapes in documents from the enrich index. See Spatial Relations for valid options and more information.
PUT /_ingest/pipeline/postal_lookup{ "processors": [ { "enrich": { "description": "Add 'geo_data' based on 'geo_location'", "policy_name": "postal_policy", "field": "geo_location", "target_field": "geo_data", "shape_relation": "INTERSECTS" } } ] }
Use the ingest pipeline to index a document. The incoming document should include the field specified in your enrich processor.
PUT /users/_doc/0?pipeline=postal_lookup{ "first_name": "Mardy", "last_name": "Brown", "geo_location": "POINT (13.5 52.5)" }
To verify the enrich processor matched and appended the appropriate field data, use the get API to view the indexed document.
GET /users/_doc/0
The API returns the following response:
{
"found": true,
"_index": "users",
"_id": "0",
"_version": 1,
"_seq_no": 55,
"_primary_term": 1,
"_source": {
"geo_data": {
"location": {
"type": "envelope",
"coordinates": [[13.0, 53.0], [14.0, 52.0]]
},
"postal_code": "96598"
},
"first_name": "Mardy",
"last_name": "Brown",
"geo_location": "POINT (13.5 52.5)"
}
}