Elastic Search Reindex: дождитесь завершения

Я пытаюсь переиндексировать 2695140 документов, используя Nest C#. Мне нужно посчитать, сколько времени ушло на переиндексацию всех документов, для которых я написал логи. Но после работы в течение 1 минуты мой код возвращает недопустимый ответ (сбой), но документы индексируются должным образом, поскольку мы запустили повторную индексацию эластичного поиска.

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

return await Client.ReindexOnServerAsync(selector => selector
                                .Source(src => src
                                  .Index(_config.SomeIndex))
                               .Destination(dest => dest
                                  .Index(newIndexName).OpType(OpType.Index))
                               .WaitForCompletion(true));

Заранее спасибо.


person Moulali Shaik    schedule 17.09.2020    source источник


Ответы (2)


Я бы хотел, чтобы мой код дождался завершения операции переиндексации.

Я не знаю, какой язык программирования вы используете, но, по сути, для языков, следующих модели «Один поток на запрос», нецелесообразно ждать операции переиндексации. Время, затрачиваемое на операцию, будет пропорционально количеству документов для переиндексации, и она блокирует поток (потребляющий ресурсы) до завершения операции.

Вместо этого вам следует:

  1. Переиндексировать, не дожидаясь завершения, например:
POST _reindex?wait_for_completion=false
   {
    "source":{
        "index":"book"
    },
    "dest":{
        "index":"book_new1"
    }
}

Ответ: будет иметь task_id

  1. Используйте API tasks для отслеживания выполнения задачи. Он также будет содержать статус, был ли запрос успешным или нет, и время, затраченное на операцию. Пример ответа для API задач будет выглядеть так:
{
  "completed" : true,
  "task" : {
    "node" : "jF8smI1eR1mwwNxl8_7z2A",
    "id" : 2427911
    },
    "description" : "reindex from [book] to [book_new1][_doc]",
    "start_time_in_millis" : 1600335207787,
    "running_time_in_nanos" : 640430472,
    "cancellable" : true,
    "headers" : { }
  },
  "response" : {
    "took" : 634,  // <====== Time taken by operation
    "timed_out" : false,
    "total" : 3,
    "updated" : 0,
    "created" : 3,
    "deleted" : 0,
    "batches" : 1,
    "version_conflicts" : 0,
    "noops" : 0
  }
}
  1. Вы можете периодически проверять (используя cron/scheduler/и т. д.) до завершения и предпринимать необходимые действия.
person Sahil Gupta    schedule 17.09.2020
comment
Спасибо @Сахил Гупта. Это может помочь мне получить время выполнения. Мне пришлось бы обновить свою логику, чтобы получить идентификатор и проверить его другим запросом. - person Moulali Shaik; 17.09.2020
comment
Не могли бы вы принять это как ответ и проголосовать, если это помогло вам. - person Sahil Gupta; 17.09.2020
comment
Я все еще жду чего-то, что я не должен использовать логику, чтобы проверить время выполнения на основе идентификатора в более поздний момент времени. Моей функции больше нечего делать, кроме этой операции. WaitForCompletion(true)) не ждет больше минуты, я хочу, чтобы моя логика дождалась завершения операции. - person Moulali Shaik; 24.09.2020

В дополнение к ответу @sahil-gupta, пожалуйста, проверьте эту опцию дождаться завершения — после запуска асинхронной задачи вы можете дождаться завершения определенной задачи или даже всех запущенных задач с помощью другого запроса:

curl "http://127.0.0.1:9200/_tasks/?wait_for_completion=true&timeout=100s"

Обратите внимание, что за исключением стандартного ответа тайм-аута (json, связанного с параметром запроса timeout) это может закончиться такой ошибкой:

context deadline exceeded (Client.Timeout exceeded while awaiting headers)

поэтому необходимо обрабатывать возможные-длинные-задачи с помощью простого цикла таких запросов.

person Tomasz Hławiczka    schedule 14.07.2021