remove field and add new field to the mapping in elastic search index

廉价感情. 提交于 2020-01-02 19:33:10

问题


I made a mistake at the time of first index creation for one field. Instead of "integer" data type mistakenly I assigned as "string" for the field "rating". But the data stored in the field was integer only. When I'm trying to calculate the average rating aggregation it was throwing an error because of the string data type.

  1. Is there a way to change the data type of the field with out reindexing?
  2. If not possible without reindex, how can I remove the rating field and add a rating field with "integer" data type?

Help me on this issue to resolve.

Update

Deleted the type in the index by using below command

curl -XDELETE 'http://localhost:9300/feedbacks_16/responses'

Deleted the type and created the type with the same name and changed the data type for my rating field and re indexed the entire data. Everything goes fine until reindexing. But the avg query not working. Below is the error I'm getting :

{ "error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[2NsGsPYLR2eP9p2zYSnKGQ][feedbacks-16][0]: ClassCastException[org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData cannot be cast to org.elasticsearch.index.fielddata.IndexNumericFieldData]}{[2NsGsPYLR2eP9p2zYSnKGQ][feedbacks_16][1]: ClassCastException[org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData cannot be cast to org.elasticsearch.index.fielddata.IndexNumericFieldData]}{[pcwXn3X-TceUO0ub29ZFgA][feedbacks_16][2]: RemoteTransportException[[tsles02][inet[/localhost:9300]][indices:data/read/search[phase/query]]]; nested: ClassCastException; }{[pcwXn3X-TceUO0ub29ZFgA][feedbacks_16][3]: RemoteTransportException[[tsles02][inet[/localhost:9300]][indices:data/read/search[phase/query]]]; nested: ClassCastException; }{[2NsGsPYLR2eP9p2zYSnKGQ][feedbacks_16][4]: ClassCastException[org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData cannot be cast to org.elasticsearch.index.fielddata.IndexNumericFieldData]}]", "status": 500 }

回答1:


Aside from a few exceptions, a mapping cannot be updated. There are some exceptions:

  • you can add new properties
  • you can promote a simple field to a multi-field
  • you can disable doc_values (but not enable them)
  • you can update the ignore_above parameter

So if you wish to transform your rating field from string to integer without recreating a new index, the only solution you have is to create a sub-field (e.g. called rating.int) of type integer.

Note that you'll still have to reindex your data in order to populate that new sub-field, though. However, if you do so, you'd be much better off simply re-creating a clean index from scratch and re-populating it.




回答2:


1) You can change data type of field without reindexing but the problem is that It wont affect your data i.e rating field will remain string as documents are stored in immutable segments but newly added field will be integer but again that wont solve your problem

2) You could delete all documents from your current index and then change the mapping with PUT API like this

$ curl -X PUT 'http://localhost:9200/your_index/your_type/_mapping?ignore_conflicts=true' -d 
'{
  "your_type": {
    "properties": {
      "rating": {
        "type": "integer"
      }
    }
  }
}'

and then reindex

but better would be to create new index with above mapping and reindex with zero downtime



来源:https://stackoverflow.com/questions/34013228/remove-field-and-add-new-field-to-the-mapping-in-elastic-search-index

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!