2017-08-28 3 views
0

-je avoir plusieurs documents dans un index, ont chacun les champs suivants:Fusionner les documents en fonction de la valeur du champ?

id serviceName Type 

Maintenant, bêtement, id n'est pas unique et je veux changer cela. Je veux utiliser Kibana/ElasticSearch pour interroger les données pour que j'ai id unique et le comportement que je veux est que si je les Docs suivants:

id serviceName Type 
1  A    T1 
1  B    T2 
1  D    T2 

-je utiliser une requête pour que j'obtenir ce résultat

1 A,B,C   T1,T2,T3 

Y a-t-il un moyen pour cela?

Répondre

1

Vous ne pouvez pas faire cela simplement avec Elasticsearch/Kibana, vous devez écrire du code. Vous pouvez utiliser le scroll api pour parcourir tous les documents de l'index, puis utiliser un upsert query pour les indexer dans un nouvel index. Je pense que votre demande de upsert ressemblera à quelque chose comme ceci:

POST test/type1/1/_update 
{ 
    "script" : { 
     "inline": "ctx._source.serviceName.add(params.serviceName); ctx._source.Type.add(params.Type)", 
     "lang": "painless", 
     "params" : { 
      "serviceName" : "A", 
      "Type": "T1" 
     } 
    }, 
    "upsert" : { 
     "serviceName": ["A"], 
     "Type": ["T1"] 
    } 
} 

Cela signifie dans le cas où id 1 n'existe pas encore, ajoutez la valeur « upsert » pour le document, sinon faire le script (qui ajoute le nom_service et valeurs de type pour le document existant).

Ce serait assez simple à faire avec très peu de code à l'aide elasticsearch-py, consultez la scan helper et bulk helper