ohadinho
ohadinho

Reputation: 7144

Elasticsearch - change field from not_analyzed to analyzed

Is it possible to modify property of an existing field from not_analyzed to analyzed ?

If not, what can I do in order to keep all my documents in store ?

I cannot delete mappings (because then all documents will be gone) and I need that old field as analyzed.

Upvotes: 5

Views: 4047

Answers (2)

Val
Val

Reputation: 217254

You cannot modify an existing field, however, you can either create another field or add a sub-field to your not_analyzed field.

I'm going for the latter solution. So first, add a new sub-field to your existing field, like this:

curl -XPUT localhost:9200/index/_mapping/type -d '{
    "properties": {
        "your_field": {
            "type": "string",
            "index": "not_analyzed",
            "fields": {
                "sub": {
                    "type": "string"
                }
            }
        }
    }
}'

Above, we've added the sub-field called your_field.sub (which is analyzed) to the existing your_field (which is not_analyzed)

Next, we'll need to populate that new sub-field. If you're running the latest ES 2.3, you can use the powerful Reindex API

curl -XPUT localhost:9200/_reindex -d '{
  "source": {
    "index": "index"
  },
  "dest": {
    "index": "index"
  },
  "script": {
    "inline": "ctx._source.your_field = ctx._source.your_field"
  }
}'

Otherwise, you can simply use the following Logstash configuration which will re-index your data in order to populate the new sub-field

input {
  elasticsearch {
   hosts => "localhost:9200"
   index => "index"
   docinfo => true
  }
}
filter {
 mutate {
  remove_field => [ "@version", "@timestamp" ]
 }
}
output {
 elasticsearch {
   hosts => ["localhost:9200"]
   manage_template => false
   index => "%{[@metadata][_index]}"
   document_type => "%{[@metadata][_type]}"
   document_id => "%{[@metadata][_id]}"
 }
}

Upvotes: 11

Anirudh Modi
Anirudh Modi

Reputation: 1829

https://www.elastic.co/guide/en/elasticsearch/reference/0.90/mapping-multi-field-type.html

You can use this... there is something known as multi field type mapping, which allows you to have more than one mapping for a single field, and you can also query based on the field type..

Upvotes: 0

Related Questions