Частично обновить документ с помощью скриптов и добавить недостающие поля - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы знать, возможно ли обновить документ, используя частичный документ, и использовать сценарий для выполнения другого действия, например, если я добавлю data1, а затем добавлю data2, я хочу, чтобы мой документ выглядел как final_result. Я хочу, чтобы все было заменено и добавлено, кроме поля тега.

data1 = {"name" : "myname", "code" : 123, "tag" : "first"}

data2 = {"name" : "myname", "code" : 555, "tag" : "second", "age":"50", "children": "3"}

final_result = {"name" : "myname", "code" : 555, "tag" : ["first","second"], "age":"50", "children": "3"}

Я могу добавить поле тега с помощью этого сценария, но я не знаю, как добавить недостающие поля одновременно, также я не знаю, какие поля могут быть добавлены в расширенный.

POST myindex/_update/1
{

      "script" : {
        "source": "if(! ctx._source.tag.contains(params.tag)){if (ctx._source.tag instanceof List) { ctx._source.tag.add(params.tag) } else { ctx._source.tag = [ctx._source.tag, params.tag] }}",
        "lang": "painless",
        "params" : {
            "tag" : "sec"
        }
    }

}

Я очень ценю, если кто-нибудь может дать мне пример того, как это сделать в python.

1 Ответ

0 голосов
/ 27 апреля 2020

Вам просто нужно установить новые значения для полей.

POST myindex/_update/1
{
  "script": {
    "source": """
    if(!ctx._source.tag.contains(params.tag)){
        if (ctx._source.tag instanceof List) { 
          ctx._source.tag.add(params.tag) 

        } else { 
          ctx._source.tag = [ctx._source.tag, params.tag] 
        }
    }
    ctx._source.code = params.code
        """,
    "lang": "painless",
    "params": {
      "tag": "sec",
      "code": "555"
    }
  }
}

Это то же самое, что и на Python, при создании экземпляра Elasticsearch и вызове update_by_query API

es = Elasticsearch(['https://user:secret@localhost:443'])

Или ...

es = Elasticsearch(
    ['localhost', 'otherhost'],
    http_auth=('user', 'secret'),
    scheme="https",
    port=443,
)

А потом ... Тело это тот же скрипт, что и у вас

self.es.update_by_query(index = indexName, body = q)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...