如何删除Elasticsearch索引的所有文档中的元素?

发布于 2025-01-21 03:54:50 字数 911 浏览 0 评论 0原文

我在 Elasticsearch 索引中有文档列表,如下所示:

...
{
  "_index" : "index-name",
  "_type" : "_doc",
  "_id" : "table1c7151240c583e60c8e2cbad351",
  "_score" : 0.28322574,
  "_source" : {
    ...
    "table.tag" : {
      "datasources_keys" : [...],
      "tags" : [
        "6e7358e2bfc84c34af32a01f6d19e9b2",
        "ab450ae5c1734fb0aad5fed052b42023",
        "f725e3100bba4b5eb8a5199a2b3e62fc"
      ]
    }
  }
},
...

我想删除所有文档中的一个元素..例如应该删除 tags 中指定的 tag_id,如 “6e7358e2bfc84c34af32a01f6d19e9b2” ..我应该如何为此编写脚本? elasticsearch还有其他方法吗?

我正在使用这个脚本..但它不起作用!

POST index-name/_update_by_query
{
  "query": {
    "match":{
      "table.tag.tags": "6e7358e2bfc84c34af32a01f6d19e9b2"
    }
  },
  "script": {
    "source": "ctx._source['table.tag']['tags'] -= 6e7358e2bfc84c34af32a01f6d19e9b2",
    "lang": "painless"
  }
}

I have list of documents in an index of Elasticsearch like below:

...
{
  "_index" : "index-name",
  "_type" : "_doc",
  "_id" : "table1c7151240c583e60c8e2cbad351",
  "_score" : 0.28322574,
  "_source" : {
    ...
    "table.tag" : {
      "datasources_keys" : [...],
      "tags" : [
        "6e7358e2bfc84c34af32a01f6d19e9b2",
        "ab450ae5c1734fb0aad5fed052b42023",
        "f725e3100bba4b5eb8a5199a2b3e62fc"
      ]
    }
  }
},
...

I wanna delete an element in all documents.. for example should remove a specified tag_id in tags like "6e7358e2bfc84c34af32a01f6d19e9b2" .. how should I write a script for that? Is there other way in elasticsearch?

I'm using this script.. but it doesnt work!!

POST index-name/_update_by_query
{
  "query": {
    "match":{
      "table.tag.tags": "6e7358e2bfc84c34af32a01f6d19e9b2"
    }
  },
  "script": {
    "source": "ctx._source['table.tag']['tags'] -= 6e7358e2bfc84c34af32a01f6d19e9b2",
    "lang": "painless"
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

棒棒糖 2025-01-28 03:54:50

这是一种更简洁的方式,具有隐式列表迭代,如果条件(+是单线

Here is a more concise way with implicit list iterations and if conditions (+ it's a one-liner ????):

POST index-name/_update_by_query
{
  "query": {
    "match": {
      "table.tag.tags": "6e7358e2bfc84c34af32a01f6d19e9b2"
    }
  },
  "script": {
    "lang": "painless"
    "source": "ctx._source['table.tag']['tags'].removeIf(tag -> tag == params.tag);",
    "params": {
      "tag": "6e7358e2bfc84c34af32a01f6d19e9b2"
    }
  }
}

UPDATE

You can add your second condition like this:

ctx._source['table.tag']['tags'].removeIf(tag -> tag == params.tag);
if (ctx._source['table.tag']['tags'].size() == 0) {
    ctx._source['table.tag'].remove('tags');
}
万人眼中万个我 2025-01-28 03:54:50

您可以尝试以下脚本:

POST index-name/_update_by_query
{
  "query": {
    "match": {
      "table.tag.tags": "6e7358e2bfc84c34af32a01f6d19e9b2"
    }
  },
 "script": {
    "source": """
    for (int i = 0; i < ctx._source['table.tag']['tags'].length; i++)
    {
      if(ctx._source['table.tag']['tags'][i]=='6e7358e2bfc84c34af32a01f6d19e9b2')
      {
            ctx._source['table.tag']['tags'].remove(i);
      }
    }"""
      }
}

You can try below script:

POST index-name/_update_by_query
{
  "query": {
    "match": {
      "table.tag.tags": "6e7358e2bfc84c34af32a01f6d19e9b2"
    }
  },
 "script": {
    "source": """
    for (int i = 0; i < ctx._source['table.tag']['tags'].length; i++)
    {
      if(ctx._source['table.tag']['tags'][i]=='6e7358e2bfc84c34af32a01f6d19e9b2')
      {
            ctx._source['table.tag']['tags'].remove(i);
      }
    }"""
      }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文