code: def migrate(move_data=True, update_alias=True):
      
      # construct a new index name by appending current timestamp
      next_index = PATTERN.replace('*', datetime.now().strftime('%Y%m%d%H%M%S%f'))
  
      # get the low level connection
      es = connections.get_connection()
  
      # create new index, it will use the settings from the template
      es.indices.create(index=next_index)
  
      if move_data:
          # move data from current alias to the new index
          es.reindex(
              body={"source": {"index": ALIAS}, "dest": {"index": next_index}},
              request_timeout=3600
          )
          # refresh the index to make the changes visible
          es.indices.refresh(index=next_index)
  
      if update_alias:
          # repoint the alias to point to the newly created index
          es.indices.update_aliases(body={
              'actions': [
                  {"remove": {"alias": ALIAS, "index": PATTERN}},
                  {"add": {"alias": ALIAS, "index": next_index}},
              ]
          })
docs: Upgrade function that creates a new index for the data. Optionally it also can
      (and by default will) reindex previous copy of the data into the new index
      (specify ``move_data=False`` to skip this step) and update the alias to
      point to the latest index (set ``update_alias=False`` to skip).
  
      Note that while this function is running the application can still perform
      any and all searches without any loss of functionality. It should, however,
      not perform any writes at this time as those might be lost.