wake-up-neo.com

Nur bestimmten Feldwert in Elasticsearch aktualisieren

Ist es möglich, einen bestimmten Feldwert in Elasticsearch zu aktualisieren, ohne andere Felder zu überschreiben. ? 

15
Johnsa Philip

Ja, Elasticsearch unterstützt Teilaktualisierungen. Das bedeutet, dass Sie Folgendes einreichen können:

  • ein Teildokument, das mit dem vorhandenen zusammengeführt wird
  • ein Skript, das über dem vorhandenen Dokument ausgeführt wird

Schauen Sie sich die update api an. In beiden Fällen geschieht unter der Haube aufgrund der Funktionsweise der zugrunde liegenden Lucene-Bibliothek, dass das zu aktualisierende Dokument abgerufen, die Änderungen übernommen und das alte Dokument mit dem neuen überschrieben wird . Am Ende des Tages handelt es sich tatsächlich um eine vollständige Neufassung des Dokuments. Sie müssen jedoch nicht das gesamte Dokument einreichen, es sei denn, Sie haben das _source-Feld deaktiviert, das standardmäßig aktiviert ist Sie können das gesamte Dokument abrufen, um Änderungen daran vorzunehmen.

18
javanna

Als codebasierter Beitrag zu dieser Antwort kann die folgende Abfrage verwendet werden:

POST /index/type/100100471/_update
{
    "doc" : {
        "yourProperty" : 10000
    }
}

Diese Abfrage aktualisiert nur yourProperty nur die Eigenschaft .

Als Ergebnis erscheint diese Antwort:

{
   "_index": "index",
   "_type": "type",
   "_id": "100100471",
   "_version": 1,
   "_shards": {
      "total": 0,
      "successful": 1,
      "failed": 0
   }
}
18
pedrouan

Wenn Sie nur den vorhandenen Feldwert aktualisieren möchten, müssen Sie diese Lösung ausprobieren:

POST IndexName/_update_by_query
{
  "script": {
    "source": """

   if (ctx._source?.Field != null) 
    {  
        ctx._source.remove('Field');
        ctx._source.put('Field', 'Value');
    }   
    """,
    "lang": "painless"
  },
  "query": {
    "terms": {
        "_id": [
          1 (Replace with Document ID)
        ]
      }
  }
}

Wenn Sie ein neues Feld mit Wert hinzufügen möchten, müssen Sie diese Lösung ausprobieren:

POST IndexName/_update_by_query
{
  "script": {
    "source": """

   if (ctx._source?.NewField == null) 
    {  
        ctx._source.hf.put('NewField', 'Value');
    }   
    """,
    "lang": "painless"
  },
  "query": {
    "terms": {
        "_id": [
          1 (Replace with Document ID)
        ]
      }
  }
}
0
Sumit Sood

In ES 7.3 lautet das neue Format:

POST /myindex/_update/mydocid
{
    "doc" : {
        "myfield": "new value of my field"
    }
}
0
Marc