Javascript 弹性搜索删除源上字段内的单个元素
我试图删除弹性字段current字段中的一个元素,我有一个数据结构: 我需要在我的节点应用程序中从produto_标记中删除一个元素,以获取id_produto_cor, 例如:Javascript 弹性搜索删除源上字段内的单个元素,javascript,node.js,elasticsearch,kibana,elastic-stack,Javascript,Node.js,elasticsearch,Kibana,Elastic Stack,我试图删除弹性字段current字段中的一个元素,我有一个数据结构: 我需要在我的节点应用程序中从produto_标记中删除一个元素,以获取id_produto_cor, 例如: { "_index" : "relatorio_recebimento_produto_hml", "_type" : "_doc", "_id" : "54XZ9HAB4DHa2O1nQlpk", "_score" : 1.0, "_
{
"_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"
}
}
我希望我的数据如下:
"_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"
}
},
...
这是我的最终结构
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
你可以使用
查询更改的结构:
遍历produto_标记,与特定值匹配,并将匹配的对象存储在数组列表中。然后遍历列表并从produto_标记中删除对象
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_标记,与特定值匹配,并将匹配的对象存储在数组列表中。然后遍历列表并从produto_标记中删除对象
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_标记:[1,2,3],然后我更改为[2,3],但是我只想删除一个元素,而不是整个字段。如果没有需要删除的值,您不能更新文档吗?您可以添加实际结果和预期结果吗?我可能可以更新此文档的整个字段,例如:produto_tags:[1,2,3],然后我更改为[2,3],但是我只想删除一个元素而不是整个字段对不起,我的结构改变了,正如你所看到的,produto_标记:[{id_produto_cor:2489664268,tags:[],我试着做一些类似的事情:script:{source:ctx.\u source.produto_tags.id_produto_cor.remove'2489664268'},但我的回答是:script_stack:[ctx.\u source.produto_tags.id_produto_cor.remove'2489664268',^--HERE],@GabrielValensuela我已经更新了新结构的答案抱歉,我的结构已更改,正如您所看到的,produto_标记:[{id_produto_cor:2489664268,tags:[]},我尝试执行如下操作:script:{source:ctx.\u source.produto_tags.id_produto_cor.remove'2489664268',但我的响应是:script_stack:[ctx.\u source.produto\u tags.id\u produto\u cor.删除'2489664268',^--HERE],@GabrielValensuela我已经更新了新结构的答案
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
}
}