2017-08-23 1 views
0

Supposons que j'ai un document avec Nested document comme:Ajout/Mise à jour de documents imbriqués à emboîtées types de données - ElasticSearch

{ 
    "dept_name" : "IT", 
    "dept_code" : "IT", 
    "staffs" : [ 
     { 
      "emp_name" : "A", 
      "emp_id" : "1", 
      "emp_salary" : "10000" 
     }, 
     { 
      "emp_name" : "B", 
      "emp_id" : "2", 
      "emp_salary" : "20000" 
     }, 
     { 
      "emp_name" : "C", 
      "emp_id" : "3", 
      "emp_salary" : "30000" 
     } 
    ] 
} 

Maintenant, je dois ajouter au type Nested « personnel », que j'ai compris comment faire cela. Voici le code de mise à jour (ajout de type imbriqué):

GET dept/dept/1/_update 
{ 
    "script": { 
    "lang": "painless", 
    "inline": "ctx._source.staffs.add(params.dept);", 
    "params": { 
     "dept": { 
       "emp_name" : "D", 
       "emp_id" : "4", 
       "emp_salary" : "40000" 
      } 
     } 
    } 
} 

Mais si je dois mettre à jour un champ ou deux du type emboîtés. Par exemple, j'ai besoin de mettre à jour le "emp_salary" à 35000 de "emp_id" = 3. Comment cela peut-il être réalisé? Pour cela, je suis venu avec une méthode comme ci-dessous (mise à jour de type imbriqué existant):

GET dept/dept/1/_update 
{ 
    "script": { 
    "lang": "painless", 
    "inline": """ 
     int i=0; 
     for(LinkedHashMap obj:ctx._source.staffs){ 
     if(obj.id==params.dept.emp_id) 
     { 
      ctx._source.staffs[i]=params.dept; 
     } 


     i++; 
    """, 
    "params": { 
     "dept": { 
       "emp_name" : "C", 
       "emp_id" : "3", 
       "emp_salary" : "35000" 
      } 
     } 
    } 
} 

Je ne suis pas sûr que ce soit un moyen efficace de le faire. Mais mon problème principal est, je ne peux pas garder deux commandes de mise à jour pour réaliser les deux fonctionnalités (Ajout de nouveaux documents imbriqués & mise à jour des champs de documents imbriqués existants). Je dois combiner les deux en un seul. Cela devrait fonctionner comme si les docs imbriqués n'existaient pas alors il devrait ajouter un nouveau doc ​​imbriqué et s'il existe, il devrait mettre à jour les docs imbriqués existants.

Répondre

0

J'ai trouvé une méthode pour le faire en utilisant le script de mise à jour. Voici le lien de post