Dec 11th, 2018: [PT-BR][Elasticsearch] Usando Field Aliases para criar uma visão unificada entre índices com mapeamento distinto


(Thiago Souza) #1

Field Aliases, que apareceu na versão 6.4, é uma poderosa funcionalidade que permite criar uma visão unificada entre índices com mapeamentos distintos.

Digamos que você tenha dois padrões de índices com mapeamentos distintos com um ou outro campo que possua a mesma semântica mas com nomes diferentes. Exemplo:

  • Índice no Padrão 1: meu-index-xpto-*
PUT meu-index-xpto-1
{
  "mappings": {
    "_doc": {
      "properties": {
        "hostname": { "type": "keyword" }
      }
    }
  }
}
  • Índice no Padrão 2: outro-index-xyz-*
PUT outro-index-xyz-1
{
  "mappings": {
    "_doc": {
      "properties": {
        "host": { "type": "keyword" }
      }
    }
  }
}

Cada índice define um campo que significa a mesma coisa, porém , usando nomes de campos diferentes: host e hostname. Se tentarmos criar um padrão de índice no Kibana, que encontra ambos índices meu-index-xpto-1 e outro-index-xyz-1, seria bem mais complexo criar buscas que sempre incluam os dois campos host e hostname. Nesse exemplo simples não parece tão complexo, mas imaginando um cenário com dezenas de índices com nomes de campo distintos, ficaria impraticável.

Para contornar esse problema, com o release da versão 6.4, surgiu uma funcionalidade nova chamada Field Aliases que permite adicionar um campo que é apenas um apelido (alias) de outro campo e com um fato muito importante: pode ser adicionada dinâmicamente em um mapeamento de um índice já existente, sem a necessidade de re-indexar dados.

No exemplo acima, poderíamos adicionar um campo novo no mapeamento do tipo alias no índice outro-index-xyz-1:

PUT outro-index-xyz-1
{
  "_doc": {
    "properties": {
      "host": { "type": "keyword" },
      "hostname": {
        "type": "alias",
        "path": "host"
      }
    }
  }
}

Com isso, podemos fazer uma busca em um campo comum chamado hostname, considerando os documentos abaixo como exemplo:

POST meu-index-xpto-1/_doc
{
  "host": "endereco.com"
}

POST outro-index-xyz-1/_doc
{
  "hostname": "endereco.com"
}

Agora é possível buscar entre esses índices de uma forma unificada no campo hostname:

GET meu-index-xpto-*,outro-index-xyz-*/_search?q=hostname:endereco.com

Depois disso, teremos o seguinte resultado:

[
  {
    "_index": "meu-index-xpto-1",
    "_type": "_doc",
    "_id": "At7QgGcBLvDVx8eIz1xL",
    "_score": 0.2876821,
    "_source": {
      "host": "endereco.com"
    }
  },
  {
    "_index": "outro-index-xyz-1",
    "_type": "_doc",
    "_id": "A97QgGcBLvDVx8eI2FxM",
    "_score": 0.2876821,
    "_source": {
      "hostname": "endereco.com"
    }
  }
]

Mesmo que o documento do index meu-index-xpto-1 não tenha sido indexado originalmente com o campo hostname, com a funcionalidade do Field Alias, é possível adicionar um campo de apelido que é resolvido em tempo de busca e não em tempo de indexação.

Outro ponto importante é que para o Kibana, os Field Aliases são completamente transparentes, ou seja, campos do tipo alias são listados como um outro campo qualquer.