Cómo resolver errores relacionados con ElasticSearch en Neos, donde no se puede cambiar el mapeo de tipo de algunos campos
Este tipo de problema suele ser causado por alguna configuración incorrecta en los archivos NodeTypes.yaml. Básicamente, algunas propiedades no deberían ser indexadas pero están siendo indexadas.
En particular, puede haber algunos campos que comparten el mismo nombre a través de la configuración, pero en realidad utilizan diferentes tipos. Por esta razón, ElasticSearch en Neos devolverá un error, porque primero encuentra el campo con ese nombre y un tipo específico, y luego lo encuentra de nuevo con el mismo nombre pero un tipo diferente.
Por ejemplo, podríamos tener un campo "altura" siendo indexado dos veces, una como tipo "cadena" y otra como tipo "entero".
Causa del error
La referencia [keyword ] en el error suele ocurrir con campos de tipo cadena. Eso es lo que debe buscar en el YAML, ya sea el nombre o el tipo del campo.
Digamos que usted tiene este archivo de configuración:
# DistributionPackages\Customer.Lottie\Configuration\NodeTypes.Content.Lottie.yaml 'Customer.Lottie:Content.LottieImage': properties: height: type: string defaultValue: "" # DistributionPackages\Customer.LoremIpsum.NodeTypes\Configuration\NodeTypes.Content.Divider.yaml 'Customer.LoremIpsum.NodeTypes:Content.Divider': properties: height: type: integer defaultValue: 1 validation: 'Neos.Neos/Validation/IntegerValidator': true 'Neos.Neos/Validation/NumberRangeValidator': minimum: 0 máximo: 255 'Neos.Neos/Validation/NotEmptyValidator': true
En este caso, puedes ver que usamos la misma propiedad "height" dos veces, una con el tipo: string y otra con el tipo: integer.
La solución
Podemos utilizar diferentes nombres para nuestras propiedades o, en nuestro caso, podemos excluir el campo de ser indexado por ElasticSearch, como esto:
properties: height: type: integer search: indexing: false properties: height: type: string search: indexing: false
Así, hemos añadido "search" al mismo nivel que "type", y luego "indexing: false" que va por debajo de la configuración de "search".
Ahora, ya que probablemente tenemos algunos otros problemas con nuestros índices ElasticSearch de todos modos, podemos eliminar todos los índices y reconstruirlos de nuevo.
Eliminando todos los índices en ElasticSearch
Empecemos por esto. Podemos ejecutar el siguiente comando en nuestro servidor, para enviar una consulta a ElasticSearch (depende de cómo lo hayas configurado):
curl -X DELETE "localhost:9200/_all"
Esto borrará todos los índices. ¿Es arriesgado? Probablemente sí. ¿Deberías evitarlo? Probablemente sí. Pero en algunos casos, esto le ahorrará horas de remapeo y depuración. En cualquier caso, Neos se encargará de reconstruir el índice, como veremos en el siguiente paso. Al menos, a mi me funcionó bien, y me decidí por este enfoque después de intentar durante más de 20 horas otras soluciones menos catastróficas, pero esta fue la única que funcionó.
Reconstruyendo el índice ElasticSearch desde Neos con Flow
Ahora vamos a ejecutar este comando en nuestro servidor:
php -d memory_limit=-1 flow nodeindex:build
Podrías incluso simplemente ejecutar `./flow nodeindex:build` pero en mi caso el índice era muy muy grande, y necesité aumentar el límite de memoria php de Plesk a 16G y ejecutar el comentario con memory_limit establecido a -1 (lo que significa: usar toda la memoria para este proceso).
No se cayó el sitio para mí, así que no te preocupes, usted debe estar bien, por otro lado tho tomó un tiempo muy largo, más de 20 minutos, e incluso después de que al parecer se quedó sin memoria (el proceso, no el servidor en su conjunto), pero tengo muchos índices porque hay muchas dimensiones (idiomas) en este sitio web. Por lo tanto creo que funcionará mejor y más rápido en tu caso, a menos que también tengas un sitio web enorme.
Créditos
¡Me gustaría dar las gracias a los chicos de la comunidad Neos Slack que me dieron consejos útiles sobre cómo resolver esto!