Neos CMS : Comment résoudre l'erreur

Neos CMS : Comment résoudre l'erreur "mapper cannot be changed from type [integer] to [keyword]" (Le mappeur ne peut pas être changé du type [integer] au type [keyword])

Publié à: 07/03/2024
Mis à jour à: 01/06/2025
Catégories
Mots clés
Traductions

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 !

Laisser un commentaire

Tous les commentaires seront soumis à approbation après avoir été envoyés. Ils pourront être publiés après quelques heures.

Vous pouvez simplement utiliser un pseudo au hasard, cela me permet au moins de répondre à vos commentaires. Et si vous choisissez de soumettre votre email, vous pouvez recevoir une notification à chaque fois que je réponds à votre commentaire.

Aucun commentaire n'a été rédigé jusqu'à présent sur cet article. Soyez le premier à partager votre opinion !

*