[Resolvendo Problemas com Elastic] — Como utilizar Reindex para alteração de mapeamento de índice?

Felipe Queiroz - Tech Lipe
4 min readJan 28, 2021

--

Fala pessoal! Beleza?

Seja muito bem vindo(a) a mais um artigo da série “Resolvendo Problemas com Elastic”, caso queira conferir os artigos desse série e de outras não deixe de conferir no Portal Techlipe.

O link é esse aqui.

Breve introdução

Nesse artigo vou apresentar para vocês um tema/pergunta que muitas vezes acaba surgindo em Q&A de meetups de Elastic que participo, principalmente quando o assunto é mapeamentos/templates, que é a seguinte:

“Beleza, entendi como funciona o mapeamento, mas como eu altero o mapeamento de um índice que já existe?”

E, sendo bem sincero, quem trabalha ativamente com índices com certeza já passou por essa dúvida na vida (eu mesmo kkkkkk). Mas, para resolver essa pergunta de uma vez por todas, vou trazer aqui nesse artigo um método que é recomendado em 90% dos casos para resolver essa pergunta que é a utilização do reindex para alterar o mapeamento de índices que já existem.

Imagem bonita para descrever um reindex kkkkkk

Vamos nessa…

De maneira prática, vamos utilizar 2 conceitos para resolver esse problema(e para ambos você pode conferir lá no nosso guia que tem artigo):

  • Reindex
  • Templates/Mappings

E antes de começarmos com o laboratório, vamos entender primeiro o problema utilizando um exemplo prático:

Temos um índice chamado “pedidos” onde dentro dele é armazenado no campo “itens_pedido” objetos, mas na prática por configuração do campo era tratado apenas como um subcampo e não como um campo do tipo “nested” que consegue armazenar e tornar buscável os objetos dentro do campo.

Exemplo de PUT de um documento e o mapeamento que é utilizado e deve ser modificado:

PUT pedidos/_doc/1
{
"itens_pedido" : [
{
"item" : "pão",
"quantidade" : 2,
"valor" : 0.50
},
{
"item" : "vassoura tunada",
"quantidade" : 1,
"valor" : 10.50
}
]

}
GET pedidos/_mapping
{
"pedidos" : {
"mappings" : {
"properties" : {
"itens_pedido" : {
"properties" : {
"item" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"quantidade" : {
"type" : "long"
},
"valor" : {
"type" : "float"
}
}
}
}
}
}
}

Considerando esse exemplo, vamos supor que se torna necessário a alteração desse mapeamento para que o campo itens_pedido se torne “nested” com a flag “include_in_parent” habilitada, sem perder nenhum dado que existe no índice.

Importante

Vale lembrar que não é possível alterar datatypes de campos que já existem dentro de um índice, então, para isso vamos criar o mapeamento do índice em um novo índice chamado pedidos-v2:

PUT pedidos-v2/
{
"mappings" : {
"properties" : {
"itens_pedido" : {
"type" : "nested",
"include_in_parent" : true,

"properties" : {
"item" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"quantidade" : {
"type" : "long"
},
"valor" : {
"type" : "float"
}
}
}
}
}
}

Ok, temos a estrutura de dados que precisamos, mas e os dados em si?

Exatamente, agora que entra o processo de reindex!

Um breve resumo, o processo de reindex consiste em praticamente copiar os dados de um índice para outro, mantendo o _id dos documentos mas sem preservar o mapeamento do índice de origem.

POST _reindex
{
"source": {
"index": "pedidos"
},
"dest": {
"index": "pedidos-v2"
}
}

E para validar se aquele documento que indexamos no índice pedidos se encontra no índice novo podemos utilizar um simples GET _search no novo índice.

GET pedidos-v2/_search
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "pedidos-v2",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"itens_pedido" : [
{
"item" : "pão",
"quantidade" : 2,
"valor" : 0.5
},
{
"item" : "vassoura tunada",
"quantidade" : 1,
"valor" : 10.5
}
]

}
}
]
}
}

Observações

Caso você não possa ter downtime na janela de migração de um índice para outro, sugiro que use aliases e aponte o novo índice para o alias já existente e desabilite no índice antigo, tornando transparente para a aplicação que estiver escrevendo ou consultando os dados.

Conclusão

É isso! Espero que você tenha gostado desse artigo e que eu tenha conseguido responder a essa clássica pergunta que vira e mexe sempre aparece!

Te vejo nos próximos artigos.

Abraços.

Escrito por:

Felipe Queiroz — Tech Lipe

--

--

Felipe Queiroz - Tech Lipe

Felipe Queiroz — Data Arch Tech Lead, Embaixador e Certified Engineer da @Elastic e criador do projeto TechLipe