Я хочу сделать резервную копию некоторых записей (например, только 1 миллион последних записей) индекса Elasticsearch и восстановить эту резервную копию на другой машине. Было бы лучше, если бы это можно было сделать с помощью доступных/встроенных функций Elasticsearch.
Я пробовал делать снимок и восстанавливать Elasticsearch (следуя коду), но похоже, что он делает резервную копию всего индекса, а не выборочных записей.
curl -H 'Content-Type: application/json' -X PUT "localhost:9200/_snapshot/es_data_dump?pretty=true" -d '
{
"type": "fs",
"settings": {
"compress" : true,
"location": "es_data_dump"
}
}'
curl -H 'Content-Type: application/json' -X PUT "localhost:9200/_snapshot/es_data_dump/snapshot1?wait_for_completion=true&pretty=true" -d '
{
"indices" : "index_name",
"type": "fs",
"settings": {
"compress" : true,
"location": "es_data_dump"
}
}'
Формат резервной копии может быть любым, главное, чтобы его можно было успешно восстановить на другом компьютере.
вы можете использовать _reinex API. он может принять любой запрос. после переиндексации у вас есть новый индекс в качестве резервной копии, который содержит запрошенные записи. легко скопируйте его куда угодно.
полная информация здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
В конце концов, я получил необходимые данные с помощью драйвера Python, потому что это то, что я нашел самым простым для данного варианта использования.
Для этого я выполнил запрос Elasticsearch и сохранил его ответ в файле в формате, разделенном новой строкой, а затем восстановил данные из него с помощью другого скрипта Python. Таким образом возвращается максимум 10 000 записей вместе с идентификатором прокрутки, который будет использоваться для получения следующих 10 000 записей и так далее.
es = Elasticsearch(timeout=30, max_retries=10, retry_on_timeout=True)
page = es.search(index=['ct_analytics'], body = {'size': 10000, 'query': _query, 'stored_fields': '*'}, scroll='5m')
while len(page['hits']['hits']) > 0:
es_data = page['hits']['hits'] #Store this as you like
scrollId = page['_scroll_id']
page = es.scroll(scroll_id=scrollId, scroll='5m')