在ES 6中,我已为以下文档建立索引:
PUT test/doc/_bulk?refresh
{"index":{"_id":1}}
{"prop1":"foo","prop2":[{"a":"123"},{"a":"456"}]}
我需要从“ prop2”中删除“ a”的值为“ 456”的元素
Painless中的remove()方法需要一个索引,所以我可以这样做:
POST /test/1/_update
{
"script": {
"lang": "painless",
"source": "ctx._source.list.remove(ctx._source.list.indexOf(params.obj))",
"params" : {"obj" : {"a": "456"}}
}}
问题在于prop2中的每个对象实际上还有其他十二个键,这些键具有不同的值-因此我无法用参数隔离元素。它要求某种查询或过滤器说“删除'a'值为'456'的任何元素。”
在Python中,如果我有这样的列表:
l=[{'a': '123', "b": '321'}, {'a': '456','b':'654'}]
我可以通过以下方法获取所需的索引:
[l.index(x) for x in l if x['a'] == '456'][0]
但是我不知道无痛方法(不知道Java,顺便说一句)。尝试了几件事;这会失败,并出现脚本编译错误:
POST /test/doc/1/_update
{
"script": {
"lang": "painless",
"source": """
l = ctx._source.list
for (x in l){
if (x['a'] == '456') {
idx = l.indexOf(x)
l.remove(idx)
}
}
"""
}}