webentwicklung-frage-antwort-db.com.de

So aktualisieren Sie das Mapping in Elasticsearch, um den Felddatentyp und den Typ der Analysatoren in Zeichenfolge zu ändern

Beim Versuch, das Mapping zu aktualisieren, wird folgende Fehlermeldung angezeigt:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [timestamp] of different type, current_type [string], merged_type [date]"}],"type":"illegal_argument_exception","reason":"
mapper [timestamp] of different type, current_type [string], merged_type [date]"},"status":400}

Ich versuche, den folgenden Befehl unter Windows auszuführen

   curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
    "properties":
    {
        "timestamp": 
        {
            "type": "date", 
            "format": "MM-dd-yyyy HH:mm:ss",
            "fielddata":{"loading" : "lazy"} }
        }
    }";

Wie kann ich den Datentyp des Datumsfelds in einem bestimmten Format von String in Datentyp ändern?.

Ich habe versucht, das Mapping eines Zeichenfolgendatentyps zu ändern, um es in eager loading und not_analyzed aus der Analyse zu ändern. Es wird jedoch der folgende Fehler angezeigt:

{"root_cause":[{"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflicts with existing mapping in other types:\n[mapper [AppName] has different [index] values, mapper [App
 different [doc_values] values, cannot change from disabled to enabled, mapper [AppName] has different [analyzer]]"}],"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflict with
existing mapping in other types:\n[mapper [AppName] has different [index] values, mapper [AppName] has different [doc_values] values, cannot change from disabled to enabled, mapper [AppName]
rent [analyzer]]"},"status":400}

Hier ist meine Frage nach dem gleichen:

 curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
"properties":
    {"AppName":
        {
        "type": "string", 
        "index" : "not_analyzed",
        "fielddata":{"loading" : "eager"}
        }
    }
}"

Wenn ich sie jedoch von not_analyzed in analyzed ändere, wird eine acknowledged=true-Nachricht angezeigt. Wie kann ich den Analysator wechseln? 

7

Sie können vorhandene Datentypzuordnungen nicht ändern. Wie elastische Dokumente sagen:

Sie können zwar zu einer vorhandenen Zuordnung hinzufügen, vorhandene Feldzuordnungen jedoch nicht ändern. Wenn für ein Feld bereits eine Zuordnung vorhanden ist, wurden wahrscheinlich Daten aus diesem Feld indiziert. Wenn Sie die Feldzuordnung ändern würden, wären die indizierten Daten falsch und könnten nicht ordnungsgemäß durchsucht werden.

Wir können ein Mapping aktualisieren, um ein neues Feld hinzuzufügen, aber ein Vorhandenes Feld kann nicht von analysiert in nicht_analyse geändert werden.

Die einzige Möglichkeit ist, einen neuen Index mit dem neuen Mapping zu erstellen und die Daten vom alten zum neuen Index zu indexieren.

9
israelst

Nein, Sie können keine einzelne Felddefinition ändern

Wenn Sie die Felddefinition für ein einzelnes Feld in einem einzelnen Typ ändern möchten, haben Sie keine andere Möglichkeit, als alle Dokumente in Ihrem Index neu zu indexieren.


Warum können Sie die Zuordnungen nicht ändern? Dieser Artikel Ändern der Zuordnung mit Null-Ausfallzeit erklärt,

Damit Ihre Daten nach Durchsucht werden können, muss Ihre Datenbank wissen, welchen Datentyp Jedes Feld enthält und wie diese indiziert werden sollen. 

Wenn Sie einen Feldtyp wechseln, z. Wenn Sie eine Zeichenfolge mit einem Datum angeben, werden alle Daten für das Feld , das Sie bereits indiziert haben, unbrauchbar. Auf die eine oder andere Weise müssen Sie dieses Feld neu indizieren.

Dies gilt nicht nur für Elasticsearch, sondern für jede Datenbank, die zum Durchsuchen - Indizes verwendet. Und wenn es keine Indizes verwendet, ist es , Was die Geschwindigkeit für Flexibilität einschränkt.


Was passiert, wenn Sie ein Dokument mit einem falschen Feldtyp indexieren?  

Eine Konvertierung wird versucht. Wenn keine gültige Konvertierung vorhanden ist, wird eine Ausnahme ausgelöst.

Elasticsearch: The Definitive Guide hat einen Hinweis zu einem Beispiel, eine string ist eingegeben, aber long wird erwartet. Eine Konvertierung wird versucht. Es wird jedoch immer noch eine Ausnahme ausgelöst, wenn keine gültige Konvertierung vorhanden ist.

[...] Wenn das Feld bereits als Typ long zugeordnet ist, versucht ES, die Zeichenfolge in eine long umzuwandeln und eine Ausnahme auszulösen, wenn dies nicht möglich ist.


Kann ich das Dokument trotzdem indizieren lassen und die fehlerhaften Felder ignorieren?

Ja. ES5 stellt einen ignore_malformed mapping-Parameter bereit. Elasticsearch Reference erklärt das, 

Wenn Sie versuchen, den falschen Datentyp in ein Feld zu indizieren, wird standardmäßig eine Ausnahme mit Ausgelöst und das gesamte Dokument abgelehnt. Wenn der Parameter ignore_malformed Auf true gesetzt ist, kann die Ausnahme ignoriert werden. Das fehlerhafte Feld Wird nicht indiziert, andere Felder im Dokument werden jedoch Normal verarbeitet.

1
sam