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.
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
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
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.
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
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
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"
}
}