我有一个python3脚本,试图重新索引现有ElasticSearch索引中的某些文档。我无法更新文档,因为我正在从自动生成的ID更改为显式分配的ID。
我目前正尝试使用delete_by_query
删除现有文档,然后在删除完成后编制索引:
self.elasticsearch.delete_by_query(
index='%s_*' % base_index_name,
doc_type='type_a',
conflicts='proceed',
wait_for_completion=True,
refresh=True,
body={}
)
但是,索引很大,因此删除可能需要几个小时才能完成。我目前正在获得ReadTimeoutError
,这会导致脚本崩溃:
WARNING:elasticsearch:Connection <Urllib3HttpConnection: X> has failed for 2 times in a row, putting on 120 second timeout.
WARNING:elasticsearch:POST X:9200/base_index_name_*/type_a/_delete_by_query?conflicts=proceed&wait_for_completion=true&refresh=true [status:N/A request:140.117s]
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='X', port=9200): Read timed out. (read timeout=140)
我的方法是否正确?如果是这样,我怎样才能让我的脚本等待足够长的时间让delete_by_query
完成?有2个超时参数可以传递给delete_by_query
- search_timeout
和timeout
,但search_timeout
默认为无超时(我认为我想要的是),以及{ {1}}似乎没有做我想要的。是否有一些其他参数可以传递给timeout
以使其等待删除完成所需的时间?或者我是否需要让我的脚本以其他方式等待?
或者使用ElasticSearch API有更好的方法吗?
答案 0 :(得分:0)
您应该将wait_for_completion
设置为False
。在这种情况下,您将获得task
详细信息,并且可以使用相应的API跟踪任务进度:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html#docs-delete-by-query-task-api
答案 1 :(得分:0)
您可以使用“request_timeout”全局参数。这将重置连接超时设置,如前所述 here
例如 -
es.delete_by_query(index=<index_name>, body=<query>,request_timeout=300)
或者设置在连接级别,例如
es = Elasticsearch(**(get_es_connection_parms()),timeout=60)