gpt4 book ai didi

python - ElasticSearch 更新不是即时的,你如何等待 ElasticSearch 完成更新它的索引?

转载 作者:太空狗 更新时间:2023-10-29 17:27:16 25 4
gpt4 key购买 nike

我正在尝试提高针对 ElasticSearch 进行测试的套件的性能。

测试需要很长时间,因为 Elasticsearch 不会在更新后立即更新它的索引。例如,以下代码运行时不会引发断言错误。

from elasticsearch import Elasticsearch
elasticsearch = Elasticsearch('es.test')

# Asumming that this is a clean and empty elasticsearch instance
elasticsearch.update(
index='blog',
doc_type=,'blog'
id=1,
body={
....
}
)

results = elasticsearch.search()
assert not results
# results are not populated

目前针对此问题的联合解决方案是将 time.sleep 调用放入代码中,以便为 ElasticSearch 提供一些时间来更新其索引。

from time import sleep
from elasticsearch import Elasticsearch
elasticsearch = Elasticsearch('es.test')

# Asumming that this is a clean and empty elasticsearch instance
elasticsearch.update(
index='blog',
doc_type=,'blog'
id=1,
body={
....
}
)

# Don't want to use sleep functions
sleep(1)

results = elasticsearch.search()
assert len(results) == 1
# results are now populated

显然这不是很好,因为它很容易失败,假设如果 ElasticSearch 更新其索引的时间超过一秒,那么测试将失败,尽管这不太可能。此外,当您像这样运行 100 次测试时,速度会非常慢。

我试图解决这个问题是查询 pending cluster jobs查看是否还有任何任务需要完成。然而,这不起作用,并且这段代码将在没有断言错误的情况下运行。

from elasticsearch import Elasticsearch
elasticsearch = Elasticsearch('es.test')

# Asumming that this is a clean and empty elasticsearch instance
elasticsearch.update(
index='blog',
doc_type=,'blog'
id=1,
body={
....
}
)

# Query if there are any pending tasks
while elasticsearch.cluster.pending_tasks()['tasks']:
pass

results = elasticsearch.search()
assert not results
# results are not populated

所以基本上,回到我最初的问题,ElasticSearch 更新不是立即,您如何等待 ElasticSearch 完成其索引的更新?

最佳答案

从 5.0.0 版本开始,elasticsearch 有一个选项:

 ?refresh=wait_for

关于索引、更新、删除和批量 API。这样,在结果在 ElasticSearch 中可见之前,请求不会收到响应。 (耶!)

参见 https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-refresh.html获取更多信息。

编辑:这个功能似乎已经是最新的 Python elasticsearch api 的一部分: https://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch.Elasticsearch.index

将您的 elasticsearch.update 更改为:

elasticsearch.update(
index='blog',
doc_type='blog'
id=1,
refresh='wait_for',
body={
....
}
)

而且您不需要任何 sleep 或轮询。

关于python - ElasticSearch 更新不是即时的,你如何等待 ElasticSearch 完成更新它的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40676324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com