2016-08-05 2 views
0

Я Хава документ в Elasticsearch:как изменить поле свойства документа в Elasticsearch с помощью 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" 
    } 
} 

Я хочу, чтобы заменить {"class": "ccc","id": 2} из items с {"class": "ccc12","id": 2}, как достичь этого?

ответ

1

Вы можете сделать это следующим образом:

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

И если вы хотите изменить несколько полей, вы можете сделать это следующим образом:

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

В этом случае , сначала найдите «id», а затем установите значение «class». Я имею в виду, что существует много полей: «{« id »: 2,« class »:« ccc »,« name »:« dddd »,« field1 »: "value1", "field1": "value2"} ', как их заменить один раз? –

+0

Вы хотите изменить несколько полей? – Val

+0

yes.By найти id, изменить все поля. –

Смежные вопросы