He estado usando la siguiente consulta para cambiar el nombre de fieldName.
POST http://localhost:9200/INDEX_NAME/_update_by_query { "query": { "exists": { "field": "NEW_FIELD_NAME" } }, "script" : { "inline": "ctx._source.NEW_FIELD_NAME = ctx._source.OLD_FIELD_NAME; ctx._source.remove(\"OLD_FIELD_NAME\");" } }Pero para más de 4,2 millones de datos. Se tarda unos 2-3 minutos.
¿Hay alguna forma de reducir la duración?
La versión de ElasticSearch es 5.6.4
La respuesta de David en Discutir es la manera difícil. Si está buscando una manera fácil y si su índice tiene más de 1 fragmento primario, puede usar el corte para paralelizar el trabajo:
POST http://localhost:9200/INDEX_NAME/_update_by_query?slices=auto&wait_for_completion=false { ... }Pero David tiene razón, deberías actualizarte en algún momento ;-)
Una forma totalmente diferente de hacer esto que garantiza cero tiempo de inactividad es crear primero un nuevo mapa de índice con el nombre de campo actualizado.
Después de eso, puede usar la API de reindexación para completar los datos en este nuevo índice. https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
Suponiendo que está utilizando alias, puede actualizar el índice subyacente para este alias una vez que finalice la reindexación. Esto asegurará que no haya tiempo de inactividad en la aplicación que utiliza estos datos. Reindex API también admite varios parámetros de configuración para acelerar el proceso de indexación.