如何使用 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 值?的主要内容,如果未能解决你的问题,请参考以下文章

删除弹性搜索中的旧索引

如何仅查询一种类型的记录的弹性搜索?

向现有文档弹性搜索添加其他属性

如何在弹性搜索中创建索引和类型?

删除亚马逊弹性搜索中的旧索引

Nest Client c# 7.0 用于弹性搜索删除别名