【问题标题】:Elastic Search delete a single element inside a field on _source弹性搜索删除 _source 字段内的单个元素
【发布时间】:2020-06-29 22:58:37
【问题描述】:

我正在尝试删除我的弹性字段的字段内的一个元素,当前,我有这个数据结构:

我需要在我的 NODE 应用程序中从 produto_tags 中删除一个 single 元素,从而获得 id_produto_cor, 例如:

  {
        "_index" : "relatorio_recebimento_produto_hml",
        "_type" : "_doc",
        "_id" : "54XZ9HAB4DHa2O1nQlpk",
        "_score" : 1.0,
        "_source" : {
          "id_usuario" : 1408,
          "data_criacao" : "2020-03-19T22:10:40.465Z",
          "produto_tags" : [
            {
              "id_produto_cor" : "2489664268",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "1000045010",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "1004600287",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "1032013410",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "2468436987",
              "tags" : [ ]
            }
          ],
          "referencia_tags" : [ ],
          "nome_relatorio" : "teste"
        }
      }
XDELETE
{
  query: {
   match: {
    produto_tags.id_produto_cor: 489664268
   }
  }
}

我希望我的数据是这样的:

       "_index" : "relatorio_recebimento_produto_hml",
       "_type" : "_doc",
       "_id" : "xYVD5XAB4DHa2O1ndFo1",
       "_score" : 1.0,
       "_source" : {
         "id_usuario" : 1376,
         "data_criacao" : "2020-03-16T21:32:46.369Z",
         "produto_tags" : [
            {
              "id_produto_cor" : "1000045010",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "1004600287",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "1032013410",
              "tags" : [ ]
            },
            {
              "id_produto_cor" : "2468436987",
              "tags" : [ ]
            }
          ],
         "referencia_tags" : { },
         "nome_relatorio" : "teste"
       }
     },
...

这是我的最终结构 zzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzz

【问题讨论】:

  • 如果没有需要删除的值,您不能更新文档吗?
  • 你能把实际结果和预期结果相加吗?
  • 我可能会更新此文档的整个字段,例如:produto_tags: [1,2,3] 我更改为 [2,3],但我只想删除一个元素不是整个字段

标签: javascript node.js elasticsearch kibana elastic-stack


【解决方案1】:

您可以使用_update_by_query

POST /index102/_update_by_query
{
  "script":{
    "source":"ctx._source.produto_tags.remove('1029831004')"
  },
  "query":{
    "match_all":{} --> modify query to target specific documents
                   --> match_all will execute script on all documents
  }
}

查询更改的结构: 遍历 produto_tags,匹配特定值并将匹配的对象存储在数组(列表)中。然后遍历列表并从 produto_tags 中删除对象

POST /<index_name>/_update_by_query
{
  "script":{
    "source":"if(ctx._source.produto_tags.size()==0) {return;} def list=[]; for(product in ctx._source.produto_tags) { if (product['id_produto_cor'] ==params.product_id){list.add(product)}} if(list.size()==0) return; for(d in list){ctx._source.produto_tags.remove(ctx._source.produto_tags.indexOf(d))}",
    "params" : {
            "product_id" : "2468436987"
        }

  },
  "query":{
    "match_all":{} --> to select specific documents
  }
}

【讨论】:

  • 抱歉,我的结构发生了变化,如您所见,"produto_tags" : [ { "id_produto_cor" : "2489664268", "tags" : [ ] }, 我试图做类似的事情:"script":{ "source":"ctx._source.produto_tags.id_produto_cor.remove('2489664268')" }, 但我的回复是:"script_stack": [ "ctx._source.produto_tags.id_produto_cor.remove('2489664268')", " ^---- HERE" ],
  • @GabrielValensuela 我已经更新了新结构的答案
猜你喜欢
  • 2018-11-03
  • 2016-08-28
  • 2014-08-16
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2018-10-12
相关资源
最近更新 更多