I am new to Elasticsearch and am currently working on implementing a geo_distance
filter for searching. As of now my index has the following mapping (I've removed some fields):
{
advert_index: {
mappings: {
advert_type: {
properties: {
__v: {
type: "long"
},
caption: {
type: "string"
},
category: {
type: "string"
},
**location: {
type: "long"
},**
}
}
}
}
The geo_distance field is going to be implemented on the location field, where an example instance looks like this:
"location": [
71,
60
],
I.e. is on geoJSON format [lon, lat]
.
I understand that I will have to update my index so that the location field is of type geo_point
, as described in the documentation (mapping-geo-point). It seems like I have to drop the index and create a new one, but I am not able to do this.
Am I on the right track? I would greatly appreciate it if anyone could help me with how I could create a new index or update my existing one with the correct data type.
Many thanks!
This question is related to
indexing
elasticsearch
geocoding
Please note that there is a mistake in the url provided in this answer:
For a PUT mapping request: the url should be as follows:
http://localhost:9200/name_of_index/_mappings/document_type
and NOT
In later Elasticsearch versions (7.x), types were removed. Updating a mapping can becomes:
curl -XPUT "http://localhost:9200/test/_mapping" -H 'Content-Type: application/json' -d'{
"properties": {
"new_geo_field": {
"type": "geo_point"
}
}
}'
As others have pointed out, if the field exists, you typically have to reindex. There are exceptions, such as adding a new sub-field or changing analysis settings.
You can't "create a mapping", as the mapping is created with the index. Typically, you'd define the mapping when creating the index (or via index templates):
curl -XPUT "http://localhost:9200/test" -H 'Content-Type: application/json' -d'{
"mappings": {
"properties": {
"foo_field": {
"type": "text"
}
}
}
}'
That's because, in production at least, you'd want to avoid letting Elasticsearch "guess" new fields. Which is what generated this question: geo data was read as an array of long
values.
Source: Stackoverflow.com