Principais Categorias de Tipos de Dados
O Elasticsearch oferece uma vasta gama de tipos de dados para modelar informações de forma eficiente. Eles podem ser agrupados nas seguintes categorias:
- Texto e Palavras-chave:
text,keyword,constant_keyword,wildcard. - Numéricos:
long,integer,short,byte,double,float,half_float,scaled_float. - Booleanos e Datas:
boolean,date. - Binários:
binary. - Estruturados e Especializados:
ip,version, e tipos de intervalo comointeger_range,float_range,date_range. - Busca de Texto e Sugestões:
annotated-text,completion. - Objetos e Relacionais:
object,flattened,nested,join. - Geoespaciais:
geo_point,geo_shape.
Diferenças antre Keyword e Text
A principal distinção entre keyword e text reside no processamento de aálise léxica. O tipo text é processado por um analisador (analyzer), que quebra a string em tokens para permitir buscas de texto completo. Em contrapartida, o tipo keyword não passa por esse processo de tokenização, armazenando a string exata. Isso torna as consultas de agregação, ordenação e correspondência exata muito mais rápidas quando se usa keyword. É uma prática comum definir campos do tipo text com um subcampo keyword dentro da propriedade fields.
Tratamento de Arrays
O Elasticsearch não possui um tipo de dado dedicado exclusivamente para arrays. Por padrão, qualquer campo pode conter zero, um ou múltiplos valores. A única restrição é que todos os elementos dentro desse array implícito devem compartilhar exatamente o mesmo tipo de dado definido no mapeamento.
Alteração de Tipos de Campos e Mapeamento
Não é possível alterar o tipo de um campo existente diretamente no mapeamento (mapping) de um índice. O mapeamento funciona de maneira similar ao schema de uma tabela relacional: novos campos podem ser adicionados, mas os tipos dos campos já existentes são imutáveis. Para modificar um tipo, é necessário realizar um processo de reindex:
- Extrair o mapeamento do índice original e criar um índice temporário com a estrutura atual.
- Copiar (reindexar) todos os dados do índice original para o índice temporário.
- Excluir o índice original.
- Criar um novo índice com o mapeamento corrigido (novos tipos de dados).
- Reindexar os dados do índice temporário para o novo índice.
- Excluir o índice temporário.
Essas operações podem ser executadas através do console de desenvolvimento (Dev Tools) do Kibana.
O Tipo Nested e o Problema da Flatenação
O tipo nested é uma variação especializada do tipo object. Ele permite que arrays de objetos sejam indexados de forma que cada objeto possa ser consultado de maneira independente. Sem o uso de nested, o Elasticsearch "achat" (flattens) a estrutura de objetos, o que pode gerar correspondências falsas devido ao produto cartesiano entre os valores dos arrays.
Veja um exemplo prático onde o achatamento causa problemas:
PUT registros_empregados/_doc/1
{
"setor": "vendas",
"colaboradores": [
{
"nome": "Carlos",
"sobrenome": "Silva"
},
{
"nome": "Ana",
"sobrenome": "Costa"
}
]
}
Se consultarmos por colaboradores com nome "Carlos" e sobrenome "Costa", o documento será retornado incorretamente, pois os campos foram achatados. Para resolver isso, o mapeamento do campo colaboradores deve ser definido como nested, e a consulta deve utilizar o nested query.
Consolidando Valores de Múltiplos Campos
Para unir os valores de dois ou mais campos em um único campo virtual durante a indexação, utiliza-se o parâmetro copy_to. O campo de destino não precisa ser amrazenado fisicamente no documento original (_source), servindo apenas para otimizar consultas.
Exemplo de como mesclar primeiro_nome e ultimo_nome em nome_inteiro:
PUT catalogo_pessoas
{
"mappings": {
"properties": {
"primeiro_nome": {
"type": "text",
"copy_to": "nome_inteiro"
},
"ultimo_nome": {
"type": "text",
"copy_to": "nome_inteiro"
},
"nome_inteiro": {
"type": "text"
}
}
}
}