根据对象值从Elasticsearch文档中的列表中删除大对象

时间:2019-02-10 02:09:26

标签: elasticsearch elasticsearch-painless

在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)
        }
      }
    """
}}

0 个答案:

没有答案