Дождитесь завершения UpdateByQuery с DSL эластичного поиска - PullRequest
0 голосов
/ 14 июня 2019

Я работаю с очень большим набором данных, и мне нужно очистить (удалить) некоторые свойства некоторых документов и сразу же добавить это свойство в другие документы. Иногда документы с удаленным свойством - это те, которые я должен обновить после. Проблема в том, что иногда возникает ConflictError, и мне интересно, как мне ждать, пока первый запрос будет полностью выполнен, чтобы позже выполнить второй. Это код, который я использую:

ubq = UpdateByQuery(using=self.es, index=self.index).update_from_dict(query1).script(source=script_remove_source)
ubq.execute()

ubq = UpdateByQuery(using=self.es, index=self.index).update_from_dict(query2).script(source=script_add_source)
ubq.execute()

Есть идеи?

В эластичных документах упоминается параметр wait_for_completion , но они не представляют пример использования. И вообще, это не Elasticsearch DSL. Я прочитал DSL документы , но ничего не сказано о синхронизации или асинхронности.

То, что я сейчас делаю, это засыпаю на 3 секунды ... И это работает, но это совершенно ужасно.

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

1 Ответ

1 голос
/ 15 июня 2019

elasticsearch-dsl-py - это высокоуровневый API поверх elasticsearch-py.Похоже, wait_for_completion уже по умолчанию имеет значение true (https://github.com/elastic/elasticsearch-py/blob/9f4baacb7059c9fb1f949fd8e726749137408a9c/elasticsearch/client/init.py#L936) и похоже, чтоasticsearch-dsl-py не меняет это (https://github.com/elastic/elasticsearch-dsl-py/blob/601f7e9c5a708a3b6144851053e0544660bcf0a7/elasticsearch_dsl/update_by_query.py#L145).

Что если вы запустите обновление?например, вы можете переслать такие параметры в API более низкого уровня на основе примера в https://github.com/elastic/elasticsearch-dsl-py/issues/870.

Может ли быть другой процесс, взаимодействующий / обновляющий записи?

...