Elasti c Поиск удалить один элемент внутри поля на _source - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь удалить элемент внутри поля моего эластичного поля c, текущий, у меня есть такая структура данных:

Мне нужно в моем приложении NODE удалить одиночный элемент из produto_tags получение 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

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете использовать _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, сопоставить с указанным значением c и сохранить соответствующий объект в массиве (списке). Затем выполните итерацию по списку и удалите объект из 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
  }
}
...