2015-11-22 2 views
3

J'ai ajouté de nouveaux mappages (principalement des versions not_analyzed de champs existants) Je dois maintenant comprendre comment réindexer les données existantes. J'ai essayé de suivre le guide sur le site de recherche élastique mais c'est trop confus. J'ai aussi essayé d'utiliser des plugins (elasticsearch-reindex, allegro/elasticsearch-reindex-tool). J'ai regardé ElasticSearch - Reindexing your data with zero downtime qui est une question similaire. J'espérais ne pas avoir à compter sur des outils externes (si possible) et essayer d'utiliser l'API en vrac (comme avec l'insert original)Comment vraiment réindexer les données dans elasticsearch

Je pourrais facilement reconstruire l'index entier car c'est une donnée en lecture seule vraiment mais ça ne marchera pas vraiment à long terme si je devrais ajouter plus de champs etc etc quand je suis en production avec lui. Je me demandais s'il y avait quelqu'un qui connaît une solution facile à comprendre/suivre ou des étapes pour un novice relatif à ES. Je suis sur la version 2 et en utilisant Windows.

+0

Quelle est la version d'ElasticSearch que vous utilisez? Si vous utilisez 2.3, l'API native _reindex est disponible. Il peut faire exactement ce que vous cherchez. Je ne suis pas sûr de quel guide vous faites référence ("le guide sur le site Web élastique de recherche") mais ceci est les docs sur l'api de reindex: https://www.elastic.co/guide/en/elasticsearch/reference/current /docs-reindex.html Si je ne me trompe pas, vous pouvez réindexer dans le même index, laissant effectivement les données en place. Il y a des problèmes de version de document que vous devez savoir cependant. –

+0

Ouais j'ai eu ce problème il y a quelques mois mais j'ai aussi remarqué que l'API reindex était disponible ... N'a pas pu vérifier si vous pouviez réindexer dans le même index – metase

+0

Il semble que vous ne pouvez pas réindexer dans le même index – metase

Répondre

0

Réindexer signifie lire les données, supprimer les données dans elasticsearch et ré-ingérer les données. Il n'y a rien de tel que «changer la cartographie des données existantes en place». Tous les outils de réindexation que vous avez mentionnés ne sont que des wrappers autour de read-> delete-> ingestion.
Vous pouvez toujours ajuster le mappage de nouveaux index et ajouter des champs ultérieurement. Tous les nouveaux champs seront indexés par rapport à ce mapping. Ou utilisez le mappage dynamique si vous ne contrôlez pas les nouveaux champs.
Jetez un oeil à Change default mapping of string to "not analyzed" in Elasticsearch pour voir comment utiliser le mappage dynamique pour obtenir des champs de chaînes not_analyzed.

La réindexation est très coûteuse. Le meilleur moyen est de créer un nouvel index et de laisser tomber l'ancien. Pour atteindre cet objectif sans temps d'arrêt, utilisez l'alias d'index pour tous vos clients. Pensez à un index appelé "data-version1". Dans les étapes:

  • créer votre index « données version1 » et lui donner un alias nommé « data »
  • uniquement utiliser l'alias « données » dans toutes vos applications clientes
  • pour mettre à jour la cartographie: créer un nouvel index (avec le nouveau mapping) appelé "data-version2" et mettez toutes vos données en
  • pour passer de la version1 à la version2: supprimez l'alias "data" sur la version1 et créez un alias "data" sur la version2 (ou créer d'abord, puis laisser tomber). le temps entre ces deux étapes vos clients n'auront pas (ou double) de données. mais le délai entre la suppression et la création d'un alias doit être si court que vos clients ne doivent pas le reconnaître.

Il est recommandé de toujours utiliser des alias.

+0

Merci d'avoir répondu. Je voulais me pencher davantage sur l'approche «zéro temps d'arrêt». Je peux encore introduire un autre jeu de données qui prendra 15-20 minutes avec une nouvelle version de la cartographie avec les champs analysés et non analysés présents (c'est un plan de sauvegarde). Vraiment je voulais explorer l'autre option de ne pas avoir à faire cela quand je suis en production – metase

+0

Vous pouvez ajouter un nouveau mappage uniquement si vous créez un nouvel index - désolé que ce n'était pas clair dans mon message. J'ai ajouté ceci ci-dessus. La plupart des utilisateurs ont des indices distincts pour chaque période (disons tous les jours). Ensuite, de nouveaux champs et/ou de nouveaux mappages sont appliqués sur tous les nouveaux index créés. J'ajoute également une pensée pour zéro temps d'arrêt dans le poste. – dtrv

0

J'ai fait face au même problème. Mais je n'ai trouvé aucune ressource pour mettre à jour le mappage et l'analyseur d'index actuels. Ma suggestion est d'utiliser scroll and scan api et réindexer vos données à un nouvel index avec de nouveaux mappages et de nouveaux champs.

0

Avec la version 2.3.4, un nouvel index api est disponible, il fera exactement ce qu'il dit. L'utilisation basique est

{ 
    "source": { 
     "index": "currentIndex" 
    }, 
    "dest": { 
     "index": "newIndex" 
    } 
} 
+0

Vous pouvez réindexer de "currentIndex" à un index temporaire, puis de nouveau à "currentIndex". Vous pouvez utiliser les paramètres op_type et version_type pour contrôler la façon dont vous gérez les doublons/les données d'écrasement. –

+0

Voilà ce que j'ai fini par faire – metase