Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Criar mappings com type que representa a mesma estrutura que se está sendo definida

Imagine que temos um documento que segue a seguinte estrutura para representar pessoas.

{    nome : 'João',
    endereco: 'Rua XXXX',
    filhos: [
        { nome: 'José',  endereco: 'Rua XXX', filhos:[]},
        { nome: 'Maria',  endereco: 'Rua BBB', filhos:[]}
    ]
}

Como que ficará o mapping para o caso do type dos filhos? Podemos referenciar a estrutura que estamos criando momento?

{
  "settings": {
    "index": {
      "number_of_shards": 3,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "pessoa": {
      "_all": {
        "type": "string",
        "index": "analyzed",
        "analyzer": "portuguese"
      },
      "properties": {
        "nome": {
          "type": "string",
          "fields": {
            "original": { 
              "type": "string", 
              "index": "not_analyzed" 
            }
          },
          "index": "analyzed",
          "analyzer": "portuguese"
        },
        "endereco": {
          "type": "string",
          "fields": {
            "original": { 
              "type": "string", 
              "index": "not_analyzed" 
            }
          },
          "index": "analyzed",
          "analyzer": "portuguese"
        },
        "filhos": {
          "type": "pessoa",//???????
          "index": "analyzed",
          "analyzer": "portuguese"
        }
      }
    }
  }
}
3 respostas

Fala ai Jovan, tudo bem ?

Cara vi que tá parado nisso fazem 3 semanas, será que já conseguiu solucionar ?

Ainda não consegui solucionar. Poderia me ajudar? Afinal quase 1 mês para responder uma pergunta é um tempo razoável.

solução!

Ola Jovan,

Primeiramente, desculpe pela demora na resposta. Bacana que resolveu explorar o Elasticsearch. Vamos lá.

Infelizmente o Elasticsearch não suporta definição de tipos customizados da maneira que você descreveu. Isso não significa que você não tenha opções. Não está claro para mim o que você pretende fazer a lista de pessoas em um momento pós indexação de dados. Estou assumindo que você quer:

  • armazenar os filhos no mesmo documento ao invés de documentos separados.
  • achar uma solução para este caso específico, ou seja, você não quer um número gigantesco (milhares) de elementos no array.
  • filhos são armazenados apenas com o documento pai (estou ignorando duplicação no caso de você armazenar um casal com filhos em comum)
  • (bom ter) poder fazer buscas nos filhos

Você pode declarar o filho como nested. Isso vai te dar um array de json objects. Como expliquei em um dos cursos, array de jsons vai ser "achatado". Note que o elasticsearch não vai validar os tipos de dados para você. Veja https://www.elastic.co/guide/en/elasticsearch/reference/5.0/nested.html para mais detalhes.

Importante: Eu não notei alteração nesta funcionalidade da versão 5 para a atual 6.2, contudo como não tenho certeza da versão do ES que está utilizando, sugiro confirmar se algo mudou em relação sua versão do ES. Para isso, basta selecionar a versão no drop down ao lado direito da página do link.