Elasticsearch Groovy脚本eachWithIndex

时间:2016-08-26 12:49:57

标签: elasticsearch groovy

这是一个时髦的脚本。问题是 ctx._source.academies.remove(index),因为ctx在那里不可见。索引变量是正确的...但我不能在那里使用ctx。有什么建议吗?

{
    "script" : "ctx._source.academies.eachWithIndex { it, index -> if(it['academy_id'] == academy_id) ctx._source.academies.remove(index) }",
    "params": {
        "academy_id": 344
    }
}

2 个答案:

答案 0 :(得分:1)

你试过这个吗?

ctx._source.academies.removeAll { it['academy_id'] == academy_id }

如果您需要检查匹配项目列表的academy_id,则可以使用以下内容:(闭包应符合标准)

ctx._source.academies.removeAll { it['academy_id'] in [academy_id, some_other_id] }

从弹性搜索的角度来看,我认为脚本可以改写如下:

{
    "script" : "ctx._source.academies.removeAll { it['academy_id'] in academy_ids }",
    "params": {
        "academy_ids": [344, 345, 346]
    }
}

答案 1 :(得分:0)

这是最好的解决方案吗?

def findIndex; ctx._source.academies.eachWithIndex { it, index -> if(it['academy_id'] == academy_id) findIndex = index }; ctx._source.academies.remove(findIndex)

但这仅适用于最后找到的对象