web-dev-qa-db-fra.com

Comment copier des données ElasticSearch dans un nouvel index

Disons que j'ai des données de film dans ElasticSearch et que je les ai créées comme ceci:

curl -XPUT "http://192.168.0.2:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972
}'

Et j'ai un tas de films de différentes années. Je veux copier tous les films d'une année donnée (donc de 1972) et les copier dans un nouvel index de "70sMovies", mais je ne voyais pas comment faire.

39
cybergoof

La meilleure approche serait d’utiliser elasticsearch-dump tool https://github.com/taskrabbit/elasticsearch-dump .

L’exemple du monde réel que j’ai utilisé:

elasticdump \
  --input=http://localhost:9700/.kibana \
  --output=http://localhost:9700/.kibana_read_only \
  --type=mapping
elasticdump \
  --input=http://localhost:9700/.kibana \
  --output=http://localhost:9700/.kibana_read_only \
  --type=data
44
KWubbufetowicz

Depuis ElasticSearch 2.3, vous pouvez maintenant utiliser l’API intégrée _reindex

par exemple:

POST /_reindex
{
  "source": {
    "index": "Twitter"
  },
  "dest": {
    "index": "new_Twitter"
  }
}

Ou seulement une pièce spécifique en ajoutant un filtre/requête

POST /_reindex
{
  "source": {
    "index": "Twitter",
    "query": {
      "term": {
        "user": "kimchy"
      }
    }
  },
  "dest": {
    "index": "new_Twitter"
  }
}

En savoir plus: https://www.elastic.co/guide/fr/elasticsearch/reference/current/docs-reindex.html

76

Découvrez sac à dos: https://github.com/jprante/elasticsearch-knapsack

Une fois le plugin installé et opérationnel, vous pouvez exporter une partie de votre index via une requête. Par exemple:

curl -XPOST 'localhost:9200/test/test/_export' -d '{
"query" : {
    "match" : {
        "myfield" : "myvalue"
    }
},
"fields" : [ "_parent", "_source" ]
}'

Cela créera une archive contenant uniquement les résultats de votre requête, que vous pourrez ensuite importer dans un autre index.

5
coffeeaddict

Pour ce faire, la méthode la plus simple consiste à écrire du code, avec l’API de votre choix, en interrogeant "année": 1972, puis en indexant ces données dans un nouvel index. Vous utiliseriez l’API de recherche ou l’API Scan and Scroll pour obtenir tous les documents, puis les indexer un par un ou l’application en bloc:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-search.html

http://www.elasticsearch.org/guide/fr/elasticsearch/reference/current/search-request-scroll.html

http://www.elasticsearch.org/guide/fr/elasticsearch/reference/current/docs-index_.html

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html

En supposant que vous ne vouliez pas faire cela via du code mais que vous recherchiez un moyen direct de le faire, je suggère l’Elasticsearch Snapshot and Restore. En gros, vous prenez un instantané de votre index existant, vous le restaurez dans un nouvel index, puis vous utilisez la commande Supprimer pour supprimer tous les documents dont l'année est autre que 1972.

Snapshot And Restore

Le module d'instantané et de restauration permet de créer des instantanés de des index individuels ou un cluster entier dans un référentiel distant. À l'heure de la publication initiale, seul le référentiel de système de fichiers partagé était pris en charge, mais maintenant une gamme de backends sont disponibles via officiellement plugins de référentiels supportés.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html

API de suppression par requête

L'API de suppression par requête permet de supprimer des documents d'un ou plusieurs des index et un ou plusieurs types basés sur une requête. La requête peut soit être fourni en utilisant une simple chaîne de requête en tant que paramètre, ou en utilisant le Requête DSL définie dans le corps de la requête.

http://www.elasticsearch.org/guide/fr/elasticsearch/reference/current/docs-delete-by-query.html

2
John Petrone

Vous pouvez le faire facilement avec elasticsearch-dump ( https://github.com/taskrabbit/elasticsearch-dump ) en trois étapes. Dans l'exemple suivant, je copie l'index "thor" dans "thor2"

elasticdump --input=http://localhost:9200/thor --output=http://localhost:9200/thor2 --type=analyzer

elasticdump --input=http://localhost:9200/thor --output=http://localhost:9200/thor2 --type=mapping

elasticdump --input=http://localhost:9200/thor --output=http://localhost:9200/thor2 --type=data
2
jpereira

Pour réindexer spécifique type de l’index source à l’index de destination type la syntaxe est

POST _reindex/
 {
 "source": {
 "index": "source_index",
 "type": "source_type",
 "query": {
  // add filter criteria
   }
 },
 "dest": {
  "index": "dest_index",
  "type": "dest_type"
  }
}
1
Ramesh Papaganti