On: September 12, 2017 
            
         
                
                
         
      Change elasticsearch mappings in rails!
To change mappings and reindex elasticsearch data with zero downtime:
- Create an alias that using to search for model (this point to whatever index we want)
 - Point this alias to old index (avoid app crash when code change)
 - Create new index + import data to this index
 - Point our alias to new index
 - Delete old index
 
# Add alias user_docs to users index
curl -XPUT 'localhost:9200/users/_alias/user_docs?pretty'
curl -XGET 'localhost:9200/user_docs/_search' # Test if working
# create new users_v1 index
curl -XPUT 'localhost:9200/users_v1'
# Import
 User.import index: 'users_v1', type: 'user', force:true
 rake environment elasticsearch:import:model CLASS='User' INDEX='users_v1' FORCE=y
# Add alias to users_v1 index
curl -XPUT 'localhost:9200/users_v1/_alias/user_docs?pretty'
# one command
curl -XPOST localhost:9200/_aliases -d '
        {
            "actions": [
                { "remove": {
                    "alias": "user_docs",
                    "index": "users"
                }},
                { "add": {
                    "alias": "user_docs",
                    "index": "users_v1"
                }}
            ]
        }'
# Delete old data index
curl -XDELETE 'localhost:9200/users'
# Callback reindex when data change
 User.last.__elasticsearch__.index_document refresh: true, index: 'users_v1'
# Change index search in search query
class User
  def self.search_user()
    # ....
    return __elasticsearch__.search(search_definition, {index: 'user_docs'})
  end
end
Reference:
- rails model elasticsearch import
 - rails search elasticsearch definition
 - change aliases elasticsearch
 - change mapping with zero downtime
 
Tagged with rails