正确的方法来删除然后重新索引ES文档

时间:2017-06-05 14:18:02

标签: python-3.x elasticsearch

我有一个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_timeouttimeout,但search_timeout默认为无超时(我认为我想要的是),以及{ {1}}似乎没有做我想要的。是否有一些其他参数可以传递给timeout以使其等待删除完成所需的时间?或者我是否需要让我的脚本以其他方式等待?

或者使用ElasticSearch API有更好的方法吗?

2 个答案:

答案 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)