Elasticsearch — Como usar delete_by_query

João Neto
3 min readSep 1, 2021

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.

pod

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!!

MAGIC!

💡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":{}
}
}
NÃO FAÇA ISSO!!!

Essa era a dica que tinha para hoje, te vejo no próximo update!

Isso é tudo, pessoal ;)

REFERÊNCIA

Link da documentação oficial: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html

--

--

João Neto

Especialista Elasticsearch, entusiasta na área de segurança da informação, cientista louco e acredita que melhor maneira de aprender é através do humor.