等待带有Elasticsearch DSL的UpdateByQuery完成

时间:2019-06-14 16:33:36

标签: python elasticsearch elasticsearch-dsl

我正在处理一个非常大的数据集,因此我需要清除(删除)某些文档的某些属性,然后立即将此类属性添加到其他文档中。有时,删除了属性的文档是我应该在之后更新的文档。问题是有时会出现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 docs,但是关于同步或异步什么也没说。

我现在正在做的是在3秒钟之间入睡...这确实有效,但是那简直太糟糕了。

谢谢!

2 个答案:

答案 0 :(得分:1)

elasticsearch-dsl-pyelasticsearch-py之上的高级API。看起来wait_for_completion已经默认为true(https://github.com/elastic/elasticsearch-py/blob/9f4baacb7059c9fb1f949fd8e726749137408a9c/elasticsearch/client/init.py#L936),看起来elasticsearch-dsl-py并没有改变它(https://github.com/elastic/elasticsearch-dsl-py/blob/601f7e9c5a708a3b6144851053e0544660bcf0a7/elasticsearch_dsl/update_by_query.py#L145)。

如果触发刷新怎么办?看来您可以根据https://github.com/elastic/elasticsearch-dsl-py/issues/870中的示例将此类参数转发到较低级别的API。

是否有另一个进程可以交互/更新记录?

答案 1 :(得分:1)

我终于通过retry_on_conflict对其进行了管理:

es.update(
                index=index,
                doc_type=doc_type,
                id=id_str,
                body={"doc": {
                    session: state
                }},
                retry_on_conflict=5
            )