如何使用 curl 在弹性搜索中删除 arraylist 值?
Posted
技术标签:
【中文标题】如何使用 curl 在弹性搜索中删除 arraylist 值?【英文标题】:how to remove arraylist value in elastic search using curl? 【发布时间】:2018-02-09 07:51:23 【问题描述】:如何使用感知控制台或 curl 在 Elasticsearch 中删除 arraylist 值?
我想删除任何数组元素。?
POST /q/q/
"a": [
"z", "q", "1"
]
它对我不起作用:
POST /q/q/AV4sjk40mWHLgYFNkmNd/_update
"script":
"lang": "painless",
"inline": "ctx._source.a -=newsupp",
"params":
"newsupp": "p"
或
POST /q/q/AV4sjk40mWHLgYFNkmNd/_update
"script":
"lang": "painless",
"inline": "ctx._source.a.remove("1")"
【问题讨论】:
尝试使用单引号,而不是"ctx._source.a.remove('1')"
"ctx._source.a.remove('1')" 抛出错误:"script": "ctx._source.a.remove('z')", "lang": "painless ", "caused_by": "type": "wrong_method_type_exception", "reason": "无法将 MethodHandle(List,int)Object 转换为 (Object,String)Object" ,
抱歉,试试这个"ctx._source.a.removeIf(e -> e.equals('1'))"
【参考方案1】:
如果要删除列表中的所有匹配项,可以这样做:
"script":
"lang": "painless",
"inline": "ctx._source.a.removeAll(Collections.singleton('1'))"
或者如果你只想删除第一个,像这样:
"script":
"lang": "painless",
"inline": "ctx._source.a.remove(ctx._source.a.indexOf('1'))"
还要注意,如果你想使用双引号,这很好,但你需要将它们转义,比如ctx._source.a.indexOf(\"1\"))
。
或带参数:
"script":
"lang": "painless",
"inline": "ctx._source.a.remove(ctx._source.a.indexOf(yourParamName))",
"params":
"yourParamName": "1"
【讨论】:
感谢@dshockley 这很好。虽然,我确实必须做出一点小小的改变。我不得不像这样使用'params.yourParamName'来引用我的参数名称ctx._source.a.remove(ctx._source.a.indexOf(params.yourParamName))
有什么方法可以删除基于通配符的值?
如果索引不存在,indexOf会返回-1吗?以上是关于如何使用 curl 在弹性搜索中删除 arraylist 值?的主要内容,如果未能解决你的问题,请参考以下文章