Дублировать документ в elasticsearch

#elasticsearch #kibana

#elasticsearch #kibana

Вопрос:

Мне нужно клонировать содержимое документа в моем индексе elasticsearch (в том же индексе) с помощью консоли kibana. Мне нужны точно такие же поля в _source документа (конечно, копия будет иметь другой идентификатор). Я попытался:

  1. ПОЛУЧИТЬ документ
  2. Создайте новый пустой экземпляр document
  3. Обновите новый документ, вручную скопировав свойства результата в (1):
 POST /blog/post/VAv2FWoBKgnBpki61WiD/_update {    "doc" : {
  "content" : "..." ...
 

Но проблема в том, что поле содержит очень длинные свойства. И иногда я получал сообщение об ошибке, поскольку строки, похоже, не обрабатываются, когда я вручную копирую их из интерфейса Kibana.

Я искал в документации, но не могу найти запрос для дублирования документа, и я думаю, что это довольно распространенная идея…

Есть какие-нибудь подсказки?

Ответ №1:

Используйте API переиндексации. Вот что вы можете сделать.

Краткое описание шагов:

  • Создайте destination_index (фиктивный). Убедитесь, что отображение точно соответствует отображению source_index
  • Используя API переиндексации, переиндексируйте этот конкретный документ из source_index в desitnation_index . Во время этой операции обновите _id (я упомянул сценарий)
  • Переиндексируйте этот документ обратно из desitnation_index в source_index

Запрос переиндексации

Шаг 1. Скопируйте документ из source_index в destination_index. (С помощью скрипта)

 POST _reindex
{
  "source": {
    "index": "source_index",
    "query": {
      "match": {
        "_id": "1"
      }
    }
  },
  "dest": {
    "index": "destination_index"
  },
  "script": {
    "inline": "ctx._id=2",
    "lang": "painless"
  }
}
 

Обратите внимание, как я добавил a script в приведенный выше запрос, который изменил _id (_id is set as 2) бы документ. В вашем destination_index будут все поля с точно такими же значениями, что и у источника, за исключением _id поля.

Шаг 2. Скопируйте этот документ из destination_index в source_index

 POST _reindex
{
  "source": {
    "index": "destination_index",
    "query": {
      "match": {
        "_id": "2"
      }
    }
  },
  "dest": {
    "index": "source_index"
  }
}
 

Теперь выполните поиск source_index , у него будет два разных документа с _ids (_id=1 and _id=2) одинаковым содержимым.

Надеюсь, это поможет!

Комментарии:

1. Большое спасибо! Конечно, это помогает. Я также нашел другую альтернативу, используя скрипт logstash 🙂