Проверьте, закончил ли Elasticsearch индексирование

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

POST /_all/_bulk
{  
   "update":{  
      "_id":419,
      "_index":"popc",
      "_type":"offers"
   }
}
{  
   "doc":{  
      "id":"419",
      "author":"foo bar",
      "number":"642-00419"
   },
   "doc_as_upsert":true
}

И я сразу проверяю, тест не проходит, потому что Elasticsearch требует некоторое время для выполнения моего запроса.
Если я засыпаю на 1 секунду перед утверждением, это работает большую часть времени, но не всегда.
Я мог бы продлить время сна, например. 3 секунды, но это делает тесты очень медленными, отсюда и мой вопрос.

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

Если что-то из этого имеет значение, я использую Elasticsearch 5.4, Laravel Scout 3.0.5 и tamayo/laravel-scout-elastic 3.0.3


person Kuba Szymanowski    schedule 29.08.2017    source источник


Ответы (2)


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

Если вы хотите видеть текущие задачи, вы можете использовать api задач.

person dshockley    schedule 29.08.2017
comment
Спасибо, я установил index.refresh_interval на 1ms, и для 1000 тестовых прогонов всегда достаточно 600 мс. - person Kuba Szymanowski; 29.08.2017

Я нашел этот PR: https://github.com/elastic/elasticsearch/pull/17986

Вы можете использовать refresh: wait_for, и Elasticsearch ответит только тогда, когда ваши данные станут доступны для поиска.

person olvlvl    schedule 09.01.2018
comment
Для этого также есть официальный документ: elastic.co /guide/en/elasticsearch/reference/current/ - person nar8789; 03.06.2020
comment
Это правильно решает проблему. Я обнаружил, что это экономит много времени, если также установить значение refresh_interval на низкое число для тестирования, как рекомендовал @dshockley. - person Nick; 18.06.2020