elasticsearch-py 批量 API 允许您通过在每条记录中包含 '_op_type': 'delete' 来批量删除记录。但是,如果您想逐个查询删除,您仍然需要进行两个查询:一个是获取要删除的记录,另一个是删除它们。
批量执行此操作的最简单方法是使用 python 模块的 scan() 帮助程序,它包装了 ElasticSearch Scroll API,因此您不必跟踪 _scroll_ids。将它与 bulk() 助手一起使用,以替代已弃用的 delete_by_query():
from elasticsearch.helpers import bulk, scan
bulk_deletes = []
for result in scan(es,
query=es_query_body, # same as the search() body parameter
index=ES_INDEX,
doc_type=ES_DOC,
_source=False,
track_scores=False,
scroll='5m'):
result['_op_type'] = 'delete'
bulk_deletes.append(result)
bulk(elasticsearch, bulk_deletes)
由于传递了_source=False,因此不会返回文档正文,因此每个结果都非常小。但是,如果你有内存限制,你可以很容易地批量处理:
BATCH_SIZE = 100000
i = 0
bulk_deletes = []
for result in scan(...):
if i == BATCH_SIZE:
bulk(elasticsearch, bulk_deletes)
bulk_deletes = []
i = 0
result['_op_type'] = 'delete'
bulk_deletes.append(result)
i += 1
bulk(elasticsearch, bulk_deletes)