2016-08-05 13 views
0

ich ein Dokument in Elasticsearch hava:wie Feldeigenschaft des Dokuments in Elasticsearch ändern java

{ 
    "_index": "test", 
    "_type": "document", 
    "_id": "1", 
    "_score": 1, 
    "_source": { 
     "class": "aaa", 
     "id": 1, 
     "items": [{ 
      "class": "aaa", 
      "id": 1 
     }, { 
      "class": "ccc", 
      "id": 2 
     }], 
     "bianhao": "123" 
    } 
} 

I {"class": "ccc","id": 2} von items mit {"class": "ccc12","id": 2} ersetzt werden soll, wie das erreichen?

Antwort

1

Sie können es wie folgt tun:

Map<String, Object> params = new HashMap<>(); 
params.put("idParam", 2); 
params.put("classParam", "ccc12"); 

client.prepareUpdate("test", "document", "1") 
    .setScript(new Script(
      "ctx._source.items.find{ it.id == idParam }['class'] = classParam", 
      ScriptService.ScriptType.INLINE, null, params)) 
    .get(); 

UPDATE

Und wenn Sie mehrere Felder ändern möchten, können Sie es wie folgt tun:

Map<String, Object> params = new HashMap<>(); 
params.put("idParam", 2); 
params.put("classParam", "ccc12"); 
params.put("field1Param", "value2"); 
params.put("field2Param", "value3"); 

client.prepareUpdate("test", "document", "1") 
    .setScript(new Script(
      "def item = ctx._source.items.find{ it.id == idParam}; if (item) {item['class'] = classParam; item['field1'] = field1Param; item['field2'] = field2Param}", 
      ScriptService.ScriptType.INLINE, null, params)) 
    .get(); 
+0

In diesem Fall Zuerst finde ich 'id' und setze den Wert auf 'class'. Ich meine, wenn es viele Felder gibt, '{" id ": 2," class ":" ccc "," name ":" dddd "," field1 ": "Wert1", "Feld1": "Wert2"} ', wie man sie einmal ersetzt? –

+0

Möchten Sie mehrere Felder ändern? – Val

+0

yes.By ID, ändern Sie alle Felder. –