【问题标题】:Remove elements/objects From Array in ElasticSearch Followed by Matching Query从 ElasticSearch 中的数组中删除元素/对象,然后匹配查询
【发布时间】:2018-08-29 06:23:43
【问题描述】:

我有以下类型的文件。

{
"_index": "example1",
"_type": "doc",
"_id": "8036",
"_score": 1,
"_source": {
  "user": "kimchy8036",
  "postDate": "2009-11-15T13:12:00",
  "locations": [
    [
      72.79887719999999,
      21.193036000000003
    ],
    [
      -1.8262150000000001,
      51.178881999999994
    ]
  ]
  }
} 

下面是映射:

   {
        "example1": {
        "mappings": {
        "doc": {
        "properties": {
        "locations": {
        "type": "geo_point"
        },
        "postDate": {
        "type": "date"
        },
        "status": {
        "type": "long"
        },
        "user": {
        "type": "text",
        "fields": {
        "keyword": {
        "type": "keyword",
        "ignore_above": 256
        }
        }
        }
        }
        }
        }
        }
            }

我可以使用以下查询添加多个位置。

POST /example1/_update_by_query
    {
    "query": {
    "match": {
    "_id": "3"
    }
    },
    "script" : {
    "lang":"painless",
    "inline": "ctx._source.locations.add(params.newsupp)",
    "params":{
    "newsupp":[-74.00,41.12121 ]
    }}
    }

但无法从位置移除数组对象。我试过下面的查询但工作。 发布示例1/doc/3/_update {

    "script" :
    {
    "lang":"painless",
    "inline":"ctx._source.locations.remove(params.tag)",
    "params":{
    "tag":[-74.00,41.12121]
    }
    }
    }

请让我知道我在哪里做错了。我正在使用弹性版本 5.5.2

【问题讨论】:

  • 尝试使用 _update_by_query 而不是 _update 端点
  • 我也试过_update_by_query。但它也不起作用。 POST /example1/_update_by_query {“查询”:{“匹配”:{“_id”:“3”}},“脚本”:{“语言”:“无痛”,“内联”:“ctx._source.locations。删除(params.newsupp)", "params":{ "newsupp":[-74.00,41.12121 ] }} }

标签: arrays elasticsearch geolocation match


【解决方案1】:
"script" : {
    "lang":"painless",
    "inline":"ctx._source.locations.remove(params.tag)",
    "params":{
      "tag":indexToRemove
    }
}

如果使用ctx._source.locations.add(elt) 添加元素,使用ctx._source.locations.remove(indexToRemove),则通过数组中元素的索引删除。

【讨论】:

    【解决方案2】:

    在无痛脚本中,Array.remove() 方法按索引而不是按值删除。

    这是一个在 Elasticsearch 脚本中按值删除数组元素的工作示例:

    POST objects/_update_by_query
    {
        "query": {
            ...  // use regular ES query to remove only in relevant documents
        },
        "script": {
            "source": """
                if (ctx._source[params.array_attribute] != null) {
                    for (int i=ctx._source[params.array_attribute].length-1; i>=0; i--) {
                        if (ctx._source[params.array_attribute][i] == params.value_to_remove) {
                            ctx._source[params.array_attribute].remove(i);
                        }
                    }
                }
            """,
            "params": {
                "array_attribute": "<NAME_OF_ARRAY_PROPERTY_TO_REMOVE_VALUE_IN>",
                "value_to_remove": "<VALUE_TO_REMOVE_FROM_ARRAY>",
            }
        }
    }
    

    如果您的脚本只从一个特定的数组属性中删除值,您可能想要简化脚本。例如,从文档的 .color_list 数组中删除 "green"

    _doc/001 = {
        "color_list": ["red", "blue", "green"]
    }
    

    删除"green"的脚本:

    POST objects/_update_by_query
    {
        "query": {
            ...  // use regular ES query to remove only in relevant documents
        },
        "script": {
            "source": """
                for (int i=ctx._source.color_list.length-1; i>=0; i--) {
                    if (ctx._source.color_list[i] == params.color_to_remove) {
                        ctx._source.color_list.remove(i);
                    }
                }
            """,
            "params": {
                "color_to_remove": "green"
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      add() 不同,remove() 采用元素的索引并将其删除。

      您的ctx._source.locationsArrayList。它有Listremove()方法:

      E 删除(整数索引)

      删除此列表中指定位置的元素(可选操作)。 ...

      其他方法见Painless API - List

      示例代码见this answer

      【讨论】:

        猜你喜欢
        • 2013-11-12
        • 1970-01-01
        • 2019-10-21
        • 2018-09-24
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 2019-05-01
        相关资源
        最近更新 更多