gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:27:01 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/60849435/

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