web-dev-qa-db-fra.com

Comment vraiment réindexer les données dans elasticsearch

J'ai ajouté de nouveaux mappages (principalement des versions non_analysées des champs existants). Je dois maintenant trouver comment réindexer les données existantes. J'ai essayé de suivre le guide sur le site Web de recherche élastique, mais c'est tout simplement trop déroutant. J'ai également essayé d'utiliser des plugins (elasticsearch-reindex, allegro/elasticsearch-reindex-tool). J'ai regardé ElasticSearch - Réindexer vos données avec zéro temps d'arrêt 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 d'origine)

Je pourrais facilement reconstruire l'index entier car il s'agit vraiment de données en lecture seule mais cela ne fonctionnera pas vraiment à long terme si je souhaite ajouter plus de champs, etc., etc. lorsque je suis en production avec. Je me demandais s'il y avait quelqu'un qui connaît une solution ou des étapes faciles à comprendre/suivre pour un débutant relatif à ES. Je suis sur la version 2 et j'utilise Windows.

14
metase

Avec la version 2.3.4, un nouvel api _reindex est disponible qui fera exactement ce qu'il dit. L'utilisation de base est

{
    "source": {
        "index": "currentIndex"
    },
    "dest": {
        "index": "newIndex"
    }
}
4
metase

La réindexation signifie lire les données, supprimer les données dans elasticsearch et ingérer à nouveau les données. Il n'y a rien de tel que "changer le mappage 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-> ingest.
Vous pouvez toujours ajuster le mappage pour de nouveaux indices et ajouter des champs plus tard. Tous les nouveaux champs seront indexés par rapport à ce mappage. Ou utilisez le mappage dynamique si vous ne contrôlez pas les nouveaux champs.
Jetez un œil à Changer le mappage par défaut de la chaîne en "non analysé" dans Elasticsearch pour voir comment utiliser le mappage dynamique pour obtenir des champs de chaînes non analysés.

La réindexation coûte très cher. Le meilleur moyen est de créer un nouvel index et de supprimer l'ancien. Pour y parvenir avec zéro temps d'arrêt, utilisez l'alias d'index pour tous vos clients. Pensez à un index appelé "data-version1". En étapes:

  • créez votre index "data-version1" et donnez-lui un alias nommé "data"
  • utilisez uniquement l'alias "data" dans toutes vos applications clientes
  • pour mettre à jour votre mapping: créez un nouvel index (avec le nouveau mapping) appelé "data-version2" et mettez toutes vos données dedans
  • pour passer de la version1 à la version2: déposez l'alias "data" sur la version1 et créez un alias "data" sur la version2 (ou créez d'abord, puis supprimez). entre ces deux étapes, vos clients ne disposeront d'aucune (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 devraient pas le reconnaître.

Il est recommandé de toujours utiliser des alias.

12
dtrv

J'ai rencontré le 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 faites défiler et scannez l'api et réindexez vos données dans un nouvel index avec un nouveau mappage et de nouveaux champs.

0
mehmet.onler

Elasticsearch Reindex de Remote hôte à Local exemple d'hôte (mise à jour de janvier 2020)

# show indices on this Host
curl 'localhost:9200/_cat/indices?v'

# edit elasticsearch configuration file to allow remote indexing
Sudo vi /etc/elasticsearch/elasticsearch.yml

## copy the line below somewhere in the file
>>>
# --- whitelist for remote indexing ---
reindex.remote.whitelist: my-remote-machine.my-domain.com:9200
<<<

# restart elaticsearch service
Sudo systemctl restart elasticsearch

# run reindex from remote machine to copy the index named filebeat-2016.12.01
curl -H 'Content-Type: application/json' -X POST 127.0.0.1:9200/_reindex?pretty -d'{
  "source": {
    "remote": {
      "Host": "http://my-remote-machine.my-domain.com:9200"
    },
    "index": "filebeat-2016.12.01"
  },
  "dest": {
    "index": "filebeat-2016.12.01"
  }
}'

# verify index has been copied
curl 'localhost:9200/_cat/indices?v'
0
smack cherry