Create or update mapping in elasticsearch


Indexing Problem Overview

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": [

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</a>;). 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!

Indexing Solutions

Solution 1 - Indexing

Generally speaking, you can update your index mapping using the put mapping api (reference here) :

curl -XPUT 'http://localhost:9200/advert_index/_mapping/advert_type' -d '
    "advert_type" : {
        "properties" : {

          //your new mapping properties


It's especially useful for adding new fields. However, in your case, you will try to change the location type, which will cause a conflict and prevent the new mapping from being used.

You could use the put mapping api to add another property containing the location as a lat/lon array, but you won't be able to update the previous location field itself.

Finally, you will have to reindex your data for your new mapping to be taken into account.

The best solution would really be to create a new index.

If your problem with creating another index is downtime, you should take a look at aliases to make things go smoothly.

Solution 2 - Indexing

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:


and NOT


Solution 3 - Indexing

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.


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAxelfranView Question on Stackoverflow
Solution 1 - IndexingThomasCView Answer on Stackoverflow
Solution 2 - IndexingAlgoriniView Answer on Stackoverflow
Solution 3 - IndexingRadu GheorgheView Answer on Stackoverflow