How to really reindex data in elasticsearch

Re-indexing means to read the data, delete the data in elasticsearch and ingest the data again. There is no such thing like “change the mapping of existing data in place.” All the re-indexing tools you mentioned are just wrappers around read->delete->ingest.
You can always adjust the mapping for new indices and add fields later. All the new fields will be indexed with respect to this mapping. Or use dynamic mapping if you are not in control of the new fields.
Have a look at Change default mapping of string to “not analyzed” in Elasticsearch to see how to use dynamic mapping to get not_analyzed fields of strings.

Re-indexing is very expensive. Better way is to create a new index and drop the old one. To achieve this with zero downtime, use index alias for all your customers. Think of an index called “data-version1”. In steps:

  • create your index “data-version1” and give it an alias named “data”
  • only use the alias “data” in all your client applications
  • to update your mapping: create a new index (with the new mapping) called “data-version2” and put all your data in (you can use the _reindex API for that)
  • to switch from version1 to version2: drop the alias “data” on version1 and create an alias “data” on version2 (or first create, then drop). the time in between those two steps your clients will have no (or double) data. but the time between dropping and creating an alias should be so short your clients shouldn’t recognize it.

It’s good practice to always use aliases.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)