(n < 300)
这是我的文档架构。{
"_index" : "test",
"_type" : "test",
"_id" : "1212",
"_version" : 5,
"found" : true,
"_source" : {
"count" : 42,
"list_data" : [ {
"list_id" : 11,
"timestamp" : 1469125397
}, {
"list_id" : 122,
"timestamp" : 1469050965
} ]
}
}
是嵌套对象。我要求更新/删除list_data
内的特定字段。我可以使用groovy脚本更新list_data
字段。
count
但不知道如何更新嵌套对象。
例如,我想将其添加到$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
"script" : "ctx._source.count = 41"
}'
。
list_data
我的文件应改为:
{
"list_id" : 121,
"timestamp" : 1469050965
}
如果我根据{
"_index" : "test",
"_type" : "test",
"_id" : "1212",
"_version" : 6,
"found" : true,
"_source" : {
"count" : 41,
"list_data" : [ {
"list_id" : 11,
"timestamp" : 1469125397
}, {
"list_id" : 121,
"timestamp" : 1469050965
}, {
"list_id" : 122,
"timestamp" : 1469050965
} ]
}
}
= 122执行删除,我的记录应该是
list_id
答案 0 :(得分:6)
要在嵌套字段中添加新元素,可以按以下步骤操作:
$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
"script" : "ctx._source.list_data += newElement",
"params": {
"newElement": {
"list_id" : 121,
"timestamp" : 1469050965
}
}
}'
要从嵌套字段列表中删除现有元素,可以按以下步骤操作:
$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '
{
"script" : "ctx._source.list_data.removeAll{it.list_id == remove_id}",
"params": {
"remove_id" : 122
}
}'
答案 1 :(得分:0)
我不知道为什么,但是我发现
ctx._source.list_data.removeAll{it.list_id == remove_id}
无法工作。相反,我像这样使用removeIf
:
ctx._source.list_data.removeIf{list_item -> list_item.list_id == remove_id}
其中list_item
可以是任意字符串。
答案 2 :(得分:0)
对我有用的是以下link中的说明。也许是ES的版本。
答案 3 :(得分:0)
使用最新版本的ElasticSearch(7.9.0。)时出现错误[UpdateRequest] unknown field [params]
,似乎语法有所更改。
以下内容适用于新版本的ElasticSearch:
$ curl -XPOST 'localhost:9200/<index-name>/_update/1212'
{
"script": {
"source": "ctx._source.list_data.removeIf(list_item -> list_item.list_id == params.remove_id);",
"params": {
"remove_id": 122
}
}
}