Elasticsearch обновляет все поле `_source` на основе поискового запроса - PullRequest
0 голосов
/ 07 июня 2018
"_source": {
         "id": "5b1676493d21784208c36041",
         "label": "name",
         "properties": {
           "name": "patrick"
         },
         "updatedAt": 1528259039542
       }

Я хочу обновить этот документ на основе id (не _id) новым документом.

Что-то вроде этого:

    "_source": {
             "dataSource": "ELASTIC",
             "entity": "vertices",
             "label": "vertices",
             "id": "5b1676493d21784208c36041",
             "properties": {
                     "name": "patrick"
                  },
             "updatedAt": 1528259039542
           }

asticsearch version:6.2, ES Java api: 6.2

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

"ctx._source.putAll(params)" была хорошая попытка, но, к сожалению, она перемещает все существующие поля в _source.ctx.

Итак, у меня работает следующее (ES 6.1):

"for (k in params.keySet()){if (!k.equals('ctx')){ctx._source.put(k, params.get(k))}}"
0 голосов
/ 07 июня 2018

Вы можете достичь того, что хотите, используя обновление по API запросов , в основном так:

POST index/_update_by_query
{
  "query": {
    "match": {
      "id": "5b1676493d21784208c36041"
    }
  },
  "script": {
    "source": "ctx._source = params",
    "params": {
       "dataSource": "ELASTIC",
       "entity": "vertices",
       "label": "vertices"
    }
  }
}

ОБНОВЛЕНИЕ: Использование Java API

Map<String, String> params = new HashMap<>();
params.put("dataSource", "ELASTIC");
params.put("entity", "vertices");
params.put("label", "vertices");

UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);
updateByQuery.source("index")
    .filter(QueryBuilders.matchQuery("id", "5b1676493d21784208c36041"))
    .size(1000)
    .script(new Script(ScriptType.INLINE, "painless", "ctx._source.putAll(params)", params));
BulkByScrollResponse response = updateByQuery.get();

Подробнее об использовании UpdateByQuery Java API и Java-клиент высокого уровня отдыха

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...