DEFINIÇÃO
Antes de começar a definição do delete_by_query eu já queria dizer o seguinte CUIDADO! Agora sim, com menos peso na consciência vamos lá… O delete_by_query como o próprio nome sugere é utilizado para fazer remoção de documentos baseado em uma determinada condição, ele é muito útil comparado ao verbo HTTP DELETE, pois o verbo HTTP DELETE não trata condição, removendo o documento de forma “singular”, o que pode gerar muito trabalho.
UTILIZAÇÃO
A utilização do “delete_by_query” apesar de simples, deve ser vista e revista várias vezes para evitar dores de cabeça, e se possível faça testes fora de ambientes produtivos!!
E SEMPRE… SEMPRE…. Eu disse sempre?! SEMPRE!!! Informe o índice que você deseja fazer a ação de delete_by_query.
Agora veremos abaixo como funciona a execução do mesmo.
Vamos iniciar criando três documentos.
POST pessoa/_doc/1
{
"nome": "gisbrino mathias",
"idade": 30
}POST pessoa/_doc/2
{
"nome": "ze das couves",
"idade": 51
}POST pessoa/_doc/3
{
"nome": "malaquias do pequi",
"idade": 60
}
Retorno:
# Request
GET pessoa/_search?filter_path=hits.hits# Response
{
"hits" : {
"hits" : [
{
"_index" : "pessoa",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"nome" : "gisbrino mathias",
"idade" : 30
}
},
{
"_index" : "pessoa",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"nome" : "ze das couves",
"idade" : 51
}
},
{
"_index" : "pessoa",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"nome" : "malaquias do pequi",
"idade" : 60
}
}
]
}
}
Agora vamos executar um delete_by_query removendo todas as pessoas que tenham mais 40 anos:
POST pessoa/_delete_by_query
{
"query": {
"range": {
"idade": {
"gte": 40
}
}
}
}
Retorno:
{
"took" : 15,
"timed_out" : false,
"total" : 2,
"deleted" : 2,
"batches" : 1,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0,
"failures" : [ ]
}
Note que o retorno do comando informa que 2 documentos foram deletados! Vamos fazer a consulta acima e ver quais registros ficaram:
# Request
GET pessoa/_search?filter_path=hits.hits# Response
{
"hits" : {
"hits" : [
{
"_index" : "pessoa",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"nome" : "gisbrino mathias",
"idade" : 30
}
}
]
}
}
Apenas o Gisbrino Mathias com 30 anos permanece no índice!
Uowwwwwwwwwwwwww… Né que funciona mesmo heein rsrs!!
💡Uma dica de $1.000.000,00 que quero compartilhar é… Antes de testar sua query direto no delete_by_query, primeiro teste é uma query de search, com isso você saberá quantos e quais documentos serão removidos antes de iniciar sua rotina de deleção.
Agora por que eu sempre falo em tomar cuidado?! Já ouviu falar na expressão DELETE sem WHERE no mundo do banco de dados?!?! Pois é… No mundo Elasticsearch temos isso também, e seria algo do tipo:
POST pessoa/_delete_by_query
{
"query":{
"match_all":{}
}
}
Essa era a dica que tinha para hoje, te vejo no próximo update!
REFERÊNCIA
Link da documentação oficial: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html