Tipos de Dados e Estratégias de Mapeamento no Elasticsearch

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 como integer_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:

  1. Extrair o mapeamento do índice original e criar um índice temporário com a estrutura atual.
  2. Copiar (reindexar) todos os dados do índice original para o índice temporário.
  3. Excluir o índice original.
  4. Criar um novo índice com o mapeamento corrigido (novos tipos de dados).
  5. Reindexar os dados do índice temporário para o novo índice.
  6. 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"
      }
    }
  }
}

Tags: elasticsearch data-types mapping nested-type reindex

Publicado em 7-2 05:29