Nehmen wir an, ich habe Filmdaten in meiner ElasticSearch und habe sie so erstellt:
curl -XPUT "http://192.168.0.2:9200/movies/movie/1" -d'
{
"title": "The Godfather",
"director": "Francis Ford Coppola",
"year": 1972
}'
Und ich habe eine Reihe von Filmen aus verschiedenen Jahren. Ich möchte alle Filme eines bestimmten Jahres (also 1972) kopieren und in einen neuen Index von "70sMovies" kopieren, aber ich konnte nicht sehen, wie das geht.
Der beste Ansatz wäre die Verwendung des Elasticsearch-Dump-Tools https://github.com/taskrabbit/elasticsearch-dump .
Das reale Beispiel, das ich verwendet habe:
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
Seit ElasticSearch 2.3 können Sie jetzt die integrierte _reindex
-API verwenden
zum Beispiel:
POST /_reindex
{
"source": {
"index": "Twitter"
},
"dest": {
"index": "new_Twitter"
}
}
Oder nur einen bestimmten Teil durch Hinzufügen eines Filters/einer Abfrage
POST /_reindex
{
"source": {
"index": "Twitter",
"query": {
"term": {
"user": "kimchy"
}
}
},
"dest": {
"index": "new_Twitter"
}
}
Lesen Sie mehr: https://www.elastic.co/guide/de/elasticsearch/reference/current/docs-reindex.html
Schauen Sie sich den Rucksack an: https://github.com/jprante/elasticsearch-knapsack
Sobald Sie das Plugin installiert haben und funktionsfähig sind, können Sie einen Teil Ihres Index per Abfrage exportieren. Zum Beispiel:
curl -XPOST 'localhost:9200/test/test/_export' -d '{
"query" : {
"match" : {
"myfield" : "myvalue"
}
},
"fields" : [ "_parent", "_source" ]
}'
Dadurch wird ein Archiv mit nur Ihren Abfrageergebnissen erstellt, das Sie dann in einen anderen Index importieren können.
Der einfachste Weg, dies zu tun, besteht darin, Code mit der API Ihrer Wahl zu schreiben, nach "year": 1972 abzufragen und diese Daten dann in einen neuen Index zu indexieren. Sie können die Such-API oder die Scan- und Scroll-API verwenden, um alle Dokumente abzurufen und sie dann entweder einzeln zu indizieren oder die Massen-API zu verwenden:
http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/search-search.html
http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/search-request-scroll.html
http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/docs-index_.html
http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/docs-bulk.html
Angenommen, Sie möchten dies nicht über Code tun, sondern suchen nach einem direkten Weg, schlage ich die Elasticsearch-Momentaufnahme und -wiederherstellung vor. Grundsätzlich würden Sie einen Snapshot Ihres vorhandenen Indexes erstellen, ihn in einen neuen Index wiederherstellen und dann den Befehl Löschen verwenden, um alle Dokumente mit einem anderen als 1972 zu löschen.
Momentaufnahme und Wiederherstellung
Mit dem Snapshot- und Restore-Modul können Snapshots von .__ erstellt werden. einzelne Indizes oder einen gesamten Cluster in ein Remote-Repository. Beim Der Zeitpunkt des ersten freigegebenen Dateisystem-Repositorys für die erste Version war unterstützt, aber jetzt gibt es eine Reihe von Backends über offiziell Unterstützte Repository-Plugins.
http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/modules-snapshots.html
Nach Abfrage-API löschen
Mit der Lösch-durch-Abfrage-API können Dokumente aus einem oder mehreren Indizes und einen oder mehrere Typen basierend auf einer Abfrage. Die Abfrage kann entweder mit einer einfachen Abfragezeichenfolge als Parameter oder mit der .__-Angabe bereitgestellt werden. Abfrage-DSL innerhalb des Anforderungstextes definiert.
http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/docs-delete-by-query.html
Mit elasticsearch-dump ( https://github.com/taskrabbit/elasticsearch-dump ) ist dies in drei Schritten problemlos möglich. Im folgenden Beispiel kopiere ich den Index "thor" nach "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
Um einen bestimmten type vom Quellindex zum Zielindex type zu sortieren, ist die Syntax
POST _reindex/
{
"source": {
"index": "source_index",
"type": "source_type",
"query": {
// add filter criteria
}
},
"dest": {
"index": "dest_index",
"type": "dest_type"
}
}