Comment résoudre les erreurs liées à ElasticSearch sur Neos, où certains types de champs ne peuvent pas être modifiés ?
Ce type de problème est généralement causé par une configuration incorrecte dans les fichiers NodeTypes.yaml. En effet, certaines propriétés ne devraient pas être indexées mais le sont en réalité.
En particulier, il peut y avoir des champs qui partagent le même nom à travers la configuration, mais qui utilisent en fait des types différents. Pour cette raison, ElasticSearch sur Neos renverra une erreur, car il trouve d'abord le champ avec ce nom et un type spécifique, puis le retrouve avec le même nom mais un type différent.
Par exemple, nous pourrions avoir un champ "height" indexé deux fois, une fois en tant que type "string" et une fois en tant que type "integer".
Cause de l'erreur
La référence [keyword] dans l'erreur se produit généralement avec des champs de type "string". C'est ce que vous devez rechercher dans le YAML, soit le nom, soit le type du champ.
Supposons que vous ayez ce fichier de configuration :
# 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 maximum : 255 'Neos.Neos/Validation/NotEmptyValidator' : true
Dans ce cas, vous pouvez voir que nous utilisons la même propriété "height" deux fois, une fois avec le type : string et une fois avec le type : integer.
La solution
Nous pouvons soit utiliser des noms différents pour nos propriétés, soit, dans notre cas, exclure le champ de l'indexation par ElasticSearch, comme ceci :
properties : height : type : integer search : indexing : false properties : height : type : string search : indexing : false
Nous avons donc ajouté "search" au même niveau que "type", puis "indexing : false" en dessous du paramètre "search".
Maintenant, puisque nous avons probablement d'autres problèmes avec nos index ElasticSearch, nous pouvons supprimer tous les index et les reconstruire.
Suppression de tous les index sur ElasticSearch
Commençons par ceci. Nous pouvons exécuter la commande suivante sur notre serveur, pour envoyer une requête à ElasticSearch (cela dépend de la façon dont vous l'avez configuré) :
curl -X DELETE "localhost:9200/_all"
Cette commande supprimera tous les index. Est-ce risqué ? Probablement oui. Devriez-vous l'éviter ? Très probablement. Mais dans certains cas, cela vous permettra d'économiser des heures de remappage et de débogage. Dans tous les cas, Neos se chargera de reconstruire l'index, comme nous le verrons dans l'étape suivante. En tout cas, cela a bien fonctionné pour moi, et je me suis décidé pour cette approche après avoir essayé pendant plus de 20 heures d'autres solutions moins catastrophiques, mais c'est la seule qui a fonctionné.
Reconstruire l'index ElasticSearch de Neos avec Flow
Lançons maintenant cette commande sur notre serveur :
php -d memory_limit=-1 flow nodeindex:build
Vous pourriez même simplement lancer `./flow nodeindex:build` mais dans mon cas, l'index était très très grand, et j'ai eu besoin d'augmenter la limite de mémoire php de Plesk à 16G et de lancer le commentaire avec memory_limit fixé à -1 (ce qui signifie : utiliser toute la mémoire pour ce processus).
Cela n'a pas fait planter le site pour moi, donc ne vous inquiétez pas, vous devriez vous en sortir, d'un autre côté cela a pris beaucoup de temps, plus de 20 minutes, et même après cela il a apparemment manqué de mémoire (le processus, pas le serveur dans son ensemble) mais j'ai beaucoup d'index parce qu'il y a beaucoup de dimensions (langues) sur ce site web. Je pense donc que cela fonctionnera mieux et plus rapidement dans votre cas, à moins que vous n'ayez également un énorme site web.
Crédits
J'aimerais remercier les membres de la communauté Slack de Neos qui m'ont donné des conseils utiles sur la façon de résoudre ce problème !