Neos CMS: Wie löst man den Fehler

Wie man Fehler im Zusammenhang mit ElasticSearch auf Neos behebt, bei denen die Zuordnung einiger Feldtypen nicht geändert werden kann

Diese Art von Problem wird normalerweise durch eine falsche Konfiguration der NodeTypes.yaml-Dateien verursacht. Im Grunde sollten einige Eigenschaften nicht indiziert werden, werden aber tatsächlich indiziert.

Insbesondere kann es einige Felder geben, die in der gesamten Konfiguration den gleichen Namen haben, aber unterschiedliche Typen verwenden. Aus diesem Grund wird ElasticSearch auf Neos einen Fehler zurückgeben, weil es zuerst das Feld mit diesem Namen und einem bestimmten Typ findet und dann noch einmal mit demselben Namen, aber einem anderen Typ.

Zum Beispiel könnte ein "height"-Feld zweimal indiziert werden, einmal als "string"-Typ und einmal als "integer"-Typ.

Die Ursache des Fehlers

Der [Schlüsselwort]-Verweis in der Fehlermeldung tritt normalerweise bei Feldern vom Typ "String" auf. Danach sollten Sie in der YAML suchen, entweder nach dem Namen oder nach dem Typ des Feldes.

Nehmen wir an, Sie haben diese Konfigurationsdatei:

# 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

In diesem Fall sehen Sie, dass wir dieselbe Eigenschaft "height" zweimal verwenden, einmal mit dem Typ: string und einmal mit dem Typ: integer.

Die Lösung

Wir können entweder andere Namen für unsere Eigenschaften verwenden oder, in unserem Fall, das Feld von der Indizierung durch ElasticSearch ausschließen, wie folgt:

 properties: height: type: integer search: indexing: false properties: height: type: string search: indexing: false

Wir haben also "search" auf der gleichen Ebene wie "type" hinzugefügt, und dann "indexing: false", das unter der "search"-Einstellung steht.

Da wir wahrscheinlich ohnehin einige andere Probleme mit unseren ElasticSearch-Indizes haben, können wir alle Indizes löschen und sie neu erstellen.

Löschen aller Indizes auf ElasticSearch

Fangen wir damit an. Wir können den folgenden Befehl auf unserem Server ausführen, um eine Anfrage an ElasticSearch zu senden (je nachdem, wie Sie es konfiguriert haben):

curl -X DELETE "localhost:9200/_all"

Dies wird alle Indizes löschen. Ist das riskant? Wahrscheinlich ja. Sollten Sie es vermeiden? Höchstwahrscheinlich. Aber in manchen Fällen erspart Ihnen das stundenlange Neuzuordnung und Fehlersuche. In jedem Fall kümmert sich Neos um die Wiederherstellung des Indexes, wie wir im nächsten Schritt sehen werden. Zumindest hat es bei mir gut funktioniert, und ich habe mich für diesen Ansatz entschieden , nachdem ich über 20 Stunden lang versucht hatte , andere, weniger katastrophale Lösungen zu finden, aber dies war die einzige, die funktionierte.

Wiederherstellen des ElasticSearch-Index von Neos mit Flow

Führen wir nun diesen Befehl auf unserem Server aus:

php -d memory_limit=-1 flow nodeindex:build

Man könnte auch einfach `./flow nodeindex:build` ausführen, aber in meinem Fall war der Index sehr sehr groß, und ich musste das php-Speicherlimit von Plesk auf 16G erhöhen und den Kommentar mit memory_limit auf -1 setzen (was bedeutet: den gesamten Speicher für diesen Prozess verwenden).

Andererseits hat es sehr lange gedauert, mehr als 20 Minuten, und selbst danach ist mir offenbar der Speicher ausgegangen (der Prozess, nicht der Server als Ganzes), aber ich habe viele Indizes, weil es viele Dimensionen (Sprachen) auf dieser Website gibt. Daher glaube ich, dass es in Ihrem Fall besser und schneller funktionieren wird, es sei denn, Sie haben auch eine große Website.

Impressum

Ich möchte mich bei den Jungs von Neos Slack Community bedanken, die mir nützliche Hinweise gegeben haben, wie ich das Problem lösen kann!

*