2015-10-22 3 views
3

J'ai un index ES de 100 Go maintenant. En ce moment j'ai besoin de changer un champ à multi-champs, tels que: username à username.username et username.raw (not_analyzed). Je sais que cela s'appliquera aux données entrantes. Mais comment puis-je faire en sorte que ce changement affecte les anciennes données? Devrais-je utiliser l'index pour faire défiler l'index entier vers un nouveau, Ou il y a une meilleure solution pour en copier un s'il vous plait.Comment copier le champ ElasticSearch dans un autre champ

+1

Vous devez réindexer tous les documents de cet index. Créez un nouvel index et réindexez-y tout ou supprimez l'index actuel et recréez-le à partir de zéro avec le nouveau mappage. –

Répondre

4

Il existe un moyen d'atteindre ce sans réindexer toutes vos données en utilisant le update by query plugin. Fondamentalement, après l'installation du plugin, vous pouvez exécuter la requête suivante et tous vos documents obtiendront le multi-champ re-peuplé.

curl -XPOST 'localhost:9200/your_index/_update_by_query' -d '{ 
    "query" : { 
     "match_all" : {} 
    }, 
    "script" : "ctx._source.username = ctx._source.username;" 
}' 

Il peut prendre un certain temps à courir sur docs 100Go, mais après cela va, le champ username.raw sera peuplé.

Note: pour que ce plugin fonctionne, il faut avoir scripting enabled.

+0

Et ne pensez-vous pas que cela va mettre un peu de pression sur le cluster, en permettant un très grand nombre de documents supprimés dans les segments? En fonction du comportement de fusion, on pourrait avoir un grand nombre de documents supprimés dans un seul segment, prenant ainsi de l'espace sur le disque et, également, affectant (dans certains cas, pourrait être pertinent) la performance de la recherche. –

+0

Tout à fait d'accord. Cependant, si cette réindexation partielle est judicieusement combinée avec une ré-optimisation après coup, les segments avec des documents supprimés devraient être éliminés. Il est également intéressant de noter qu'une réindexation complète dans le même index aurait le même effet. En fin de compte, mes tripes me disent que la mise à jour par requête + optimisation prendrait moins de temps que de recréer l'index à partir de zéro, mais c'est juste moi basé sur des expériences passées faisant la même chose. – Val

+1

L'optimisation devrait être avec max_num_segments = 1. 100 Go de documents prendrait un peu de temps pour optimiser. À mon avis, supprimer l'index et le recréer (bien sûr, si les données sont stockées ailleurs et que la réindexation est possible à partir de cet endroit) prendrait certainement moins de temps que la mise à jour de chaque document et ensuite l'optimisation. –

0

index POST/type/_update_by_query

{ 
    "query" : { 
     "match_all" : {} 
    }, 
    "script" :{ 
     "inline" : "ctx._source.username = ctx._source.username;", 
     "lang" : "painless" 
    } 
} 

Cela a fonctionné pour moi es 5.6, au-dessus d'un n'a pas!