Volatil3
Volatil3

Reputation: 15008

Unable to update index with mapping in Elasticsearch 7.x

I am trying to follow this resource to update the mapping in an existing index but it is given an error:

{
    "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "mapper [NAME] cannot be changed from type [text] to [keyword]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "mapper [NAME] cannot be changed from type [text] to [keyword]"
    },
    "status": 400
}

Below is the request I am hitting:

curl -X PUT \
  http://localhost:9200/company/_mapping \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: a8384316-7374-069c-05e5-5be4e0a8f6d8' \
  -d '{
"dynamic": "strict",
  "properties": {
    "NAME": {
      "type": "keyword"
    },
    "DOJ": {
      "type": "date"
    }
  }
}'

I know I can re-create an index with the new mapping but why can't I update the existing one?

Upvotes: 1

Views: 8390

Answers (3)

Ofer Rahat
Ofer Rahat

Reputation: 878

Can you specify the NAME? it happen to me because NAME included a point (e.g. "histological.group"

Upvotes: 0

Joe - Check out my books
Joe - Check out my books

Reputation: 16943

The comments in this thread are correct in that changing a text field to a keyword field would be considered a mapping breaking change (and raise the "cannot be changed from [type] to [type]" exception).

You can, however, extend the original text mapping to become a multi-field mapping containing a keyword:

curl -X PUT \
  http://localhost:9200/company/_mapping \
  -H 'content-type: application/json' \
  -d '{
  "dynamic": "strict",
  "properties": {
    "NAME": {
      "type": "text",
      "fields": {
        "keyword": {              <---
          "type": "keyword"
        }
      }
    },
    "DOJ": {
      "type": "date"
    }
  }
}'

Once this adjustment is through, you can easily pick up this new property through a blank Update by query call:

curl -X PUT \
  http://localhost:9200/company/_update_by_query \
  -H 'content-type: application/json'

Finally, you can target the NAME.keyword in your queries. The good thing is, you'll have retained the original text too.

Upvotes: 1

Ron Serruya
Ron Serruya

Reputation: 4456

You cannot change the mapping of an existing field, you need to create a new index with the correct mapping then reindex your data

Except for supported mapping parameters, you can’t change the mapping or field type of an existing field. Changing an existing field could invalidate data that’s already indexed.

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html#updating-field-mappings

Upvotes: 0

Related Questions