我有以下ES对象:
{
"_index": "index_name",
"_type": "my_type",
"_id": "12345678-abcd-9012-efgh-3456ijkl7890"
"_source": {
"apps": [
{
"processName": "process_name_1",
"name": "app_name_1",
"VersionName": "version_1"
},
{
"processName": "process_name_2",
"name": "app_name_2",
"VersionName": "version_2"
}
]
}
}
我想在保留现有数据的同时,将另一个对象添加到"应用程序"数组中,使其看起来如下:
{
"_index": "index_name",
"_type": "my_type",
"_id": "12345678-abcd-9012-efgh-3456ijkl7890"
"_source": {
"apps": [
{
"processName": "process_name_1",
"name": "app_name_1",
"VersionName": "version_1"
},
{
"processName": "process_name_2",
"name": "app_name_2",
"VersionName": "version_2"
},
{
"processName": "process_name_3",
"name": "app_name_3",
"VersionName": "version_3"
}
]
}
}
正如你所看到的,我只向这些应用程序对象添加了第三个"应用程序"。我需要在Python中使用elasticsearch模块来完成这项工作。我的所有尝试要么覆盖现有项目,要么无效。我尝试使用"ctx._source.apps+=newapps"脚本,但使用Python,它似乎只是在"apps"对象旁边附加一个名为"scripts"的新对象和新数据,而不是仅添加到"apps)对象。有什么想法吗?
类似的东西应该可以工作,您可以参考python的更新api了解更多信息。您需要将script
放入body
参数中
from elasticsearch import Elasticsearch
es = Elasticsearch()
es.update(
index="index_name",
doc_type="my_type",
id="12345678-abcd-9012-efgh-3456ijkl7890",
body={"script": "ctx._source.apps += app",
"params": {
"app": {
"processName": "process_3",
"name": "name_3",
"VersionName": "version_3"
}
}
}
)