Подтвердить что ты не робот

Как скопировать некоторые данные ElasticSearch в новый индекс

Скажем, у меня есть данные о фильме в моем ElasticSearch, и я создал их следующим образом:

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

И у меня есть куча фильмов с разных лет. Я хочу скопировать все фильмы с определенного года (так, 1972) и скопировать их в новый индекс "70sMovies", но я не мог понять, как это сделать.

4b9b3361

Ответ 1

Лучшим подходом было бы использовать инструмент elasksearch-dump https://github.com/taskrabbit/elasticsearch-dump.

Пример реального мира, который я использовал:

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

Ответ 2

Так как ElasticSearch 2.3 теперь можно использовать встроенный _reindex API

например:

POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}

Или только конкретная часть, добавив фильтр/запрос

POST /_reindex
{
  "source": {
    "index": "twitter",
    "query": {
      "term": {
        "user": "kimchy"
      }
    }
  },
  "dest": {
    "index": "new_twitter"
  }
}

Подробнее: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html

Ответ 3

Проверьте рюкзак: https://github.com/jprante/elasticsearch-knapsack

После установки и работы плагина вы можете экспортировать часть своего индекса по запросу. Например:

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

Это создаст tarball только с результатами вашего запроса, которые затем можно импортировать в другой индекс.

Ответ 4

Ну, простой способ сделать это - написать код с API по вашему выбору, запросив "год": 1972, а затем индексировать эти данные в новый индекс. Вы должны использовать API поиска api или Scan и Scroll для получения всех документов, а затем либо индексировать их по одному, либо использовать Bulk Api:

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

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

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

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

Предполагая, что вы не хотите делать это с помощью кода, но ищете прямой способ сделать это, я предлагаю Snapshot и восстановление Elasticsearch. В основном вы бы сделали снимок существующего индекса, восстановили его в новый индекс и затем использовали команду "Удалить", чтобы удалить все документы за год, отличный от 1972 года.

Снимок и восстановление

Модуль моментального снимка и восстановления позволяет создавать моментальные снимки отдельные индексы или весь кластер в удаленный репозиторий. В время первоначального релиза только совместно используемого репозитория файловой системы поддерживается, но теперь ряд бэкэндов доступен через официальные поддерживаемых плагинов репозитория.

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

Удалить по API запросов

API-интерфейс delete by query позволяет удалять документы из одного или нескольких индексы и один или несколько типов на основе запроса. Запрос может либо предоставляться с использованием простой строки запроса в качестве параметра или с использованием Запрос DSL, заданный в теле запроса.

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

Ответ 5

Вы можете легко сделать это с помощью elasticsearch-dump (https://github.com/taskrabbit/elasticsearch-dump) в три этапа. В следующем примере я копирую индекс "thor" в "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