2016-09-03 6 views
0

Ok Ich habe ein elastischer Suchindex Benutzer namens erstellt, die wie folgt aussieht:hinzufügen neues Feld vorhandenen Index in Elasticsearch

$response = $client->index([ 
     'index' => 'users', 
     'type' => 'user', 
     'id' => Auth::user()->id, 
     'body' => [ 
      'username' => Auth::user()->username, 
      'name' => Auth::user()->name, 
      'city' => Auth::user()->getCity(), 
     ], 

    ]); 

ich bereits einige Daten indiziert. Ich möchte ein neues Feld ‚Standort‘ auf diesen Index genannt hinzufügen, so dass es nun sein wird:

$response = $client->index([ 
     'index' => 'users', 
     'type' => 'user', 
     'id' => Auth::user()->id, 
     'body' => [ 
      'username' => Auth::user()->username, 
      'name' => Auth::user()->name, 
      'city' => Auth::user()->getCity(), 
      'location' => [$origin], 
     ], 

    ]); 

meine Frage ist, wie ich auf die bereits vorhandenen Daten dieses Feld hinzufügen. Ich habe bereits Benutzer, aber ohne das Standortfeld. Ich brauche das Feld zu den alten Benutzer Daten hinzufügen, so dass, wenn ein Benutzer ihre Daten aktualisiert, Sie keine Scherbe Fehler

{"error":{"root_cause":[{"type":"document_missing_exception","reason":"[user][130]: document missing","shard":"0","index":"users"}],"type":"document_missing_exception","reason":"[user][130]: document missing","shard":"0","index":"users"},"status":404} 

Antwort

1

Ich bin nicht sicher, warum Sie Shards fehlende Fehler für so etwas sehen. Bei Elasticsearch sind Zuordnungen standardmäßig dynamisch (siehe Dynamic Mapping). Dies bedeutet, dass Sie in der Lage sein sollten, die Index-API wie bereits beim Hinzufügen neuer Standortinformationen zu vorhandenen und neuen Benutzerdokumenten zu treffen und in der Lage zu sein, diese Informationen zu durchsuchen.

Der Nachteil besteht darin, dass Sie möglicherweise ein Dokument indiziert haben, bei dem Standortinformationen einem bestimmten Typ im Mapping zugeordnet wurden und nachfolgende Dokumente Standortinformationen enthalten, die nicht mit diesem Typ übereinstimmen (siehe Field datatypes). Vielleicht möchten Sie prüfen, ob Sie die Elasticsearch-Zuordnungen gut kontrollieren können, um Probleme wie diese zu vermeiden, oder vielleicht ist das Problem etwas ganz anderes.

EDIT: basierend auf mehr Details in der Frage zur Verfügung gestellt vor kurzem in Bezug auf die document_missing_exception, ist dies nicht so relevant.

+0

mein Problem ist, wenn ich den Index erstellt habe, ich habe es ohne 'Standort' => [$ Herkunft], jetzt möchte ich das zu meinem Index hinzufügen. Wenn ich den Index mit Benutzerinformationen aktualisiere, die sich vor dem Hinzufügen von 'location' => [$ origin] angemeldet haben, erhalte ich Fehler bei der Aktualisierung {{error}: {"root_cause": [{"type": "document_missing_exception" , "Grund": "[Benutzer] [130]: Dokument fehlt", "Shard": "0", "Index": "Benutzer"}], "Typ": "document_missing_exception", "Grund": "[Benutzer ] [130]: Dokument fehlt "," shard ":" 0 "," index ":" Benutzer "}," status ": 404} – Luna

1

fehlt erhalten Sie, dass unter Verwendung des Update API

erreichen

Wenn das ein neuer Index - das Update schlägt fehl.

Um dies zu vermeiden - Upsert verwenden.

+0

Ich weiß, wie man das Dokument aktualisiert, aber ich habe Probleme beim Aktualisieren von Benutzern, die ip signiert haben, bevor ich 'location' => [$ origin] zum Index hinzugefügt habe. Neue Benutzer kann ich gut aktualisieren. Die Benutzer, die sich angemeldet haben, bevor ich den Index hinzugefügt habe, habe ich Probleme mit – Luna

+0

Das ist dein Missverständnis. Update ist eine Option des bestehenden Wertes, um Felder hinzufügen zu können (genau das, was Sie erreichen wollen), Das Problem mit update ist, wenn die ID nicht gefunden wird, daher müssen Sie Upsert verwenden (Einfügen, wenn die ID nicht gefunden wird) . – Erik

Verwandte Themen