Ist es möglich, einen bestimmten Feldwert in Elasticsearch zu aktualisieren, ohne andere Felder zu überschreiben. ?
Ja, Elasticsearch unterstützt Teilaktualisierungen. Das bedeutet, dass Sie Folgendes einreichen können:
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.
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
}
}
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)
]
}
}
}
In ES 7.3 lautet das neue Format:
POST /myindex/_update/mydocid
{
"doc" : {
"myfield": "new value of my field"
}
}