Dec 11th, 2017: [PT-BR][Elasticsearch] É preciso indexar um documento pai antes do filho?


(Thiago Souza) #1

Em um mapeamento Parent/Child, não é necessário que o documento pai tenha sido indexado primeiro para indexar o documento filho. Sendo assim é possível indexar o documento filho primeiro, antes do pai ser indexado. O único requisito é que, ao indexar o documento filho, é preciso saber o ID do documento pai de antemão.

Por exemplo, considerando um documento pai com ID 1 e documento filho com ID 2, os seguintes comandos podem acontecer nesta exata ordem:

  1. Crie o index
PUT parent-child
{
 "mappings": {
  "doc": {
   "properties": {
    "name": { "type": "keyword" },
    "type": {
     "type": "join",
     "relations": {
      "parent": "child"
     }
    }
   }
  }
 }
}
  1. Indexe primeiro o filho (com routing sendo o ID do pai - é preciso saber o ID do pai de antemão)
PUT /parent-child/doc/2?routing=1
{
 "name": "thiago",
 "type": {
  "name": "child",
  "parent": 1
 }
}
  1. Indexe o pai depois (usando o mesmo ID)
PUT /parent-child/doc/1
{
 "type": "parent"
}
  1. Verifique que o documento filho existe e que está corretamente associado ao pai procurando um documento pai com ID 1 and que tem um filho com name: "thiago":
GET /parent-child/_search
{
 "query": {
  "bool": {
   "must": [
    {
     "ids": {
      "type": "doc",
      "values": [ "1" ]
     }
    },
    {
     "has_child": {
      "type": "child",
      "query": {
       "term": { "name": "thiago" }
      }
     }
    }
   ]
  }
 }

(Mark Walkom) closed #2