我看到以下 API 将在 Elasticsearch 中按查询删除 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
但我想对 Elasticsearch 批量 API 做同样的事情,即使我可以使用批量上传文档
es.bulk(body=json_batch)
我不确定如何使用用于 Elastic 搜索的 python 批量 API 通过查询调用删除。
最佳答案
elasticsearch-py
批量 API 允许您通过在每条记录中包含 '_op_type': 'delete'
来批量删除记录。但是,如果你想按查询删除,你仍然需要进行两个查询:一个是获取要删除的记录,另一个是删除它们。
批量执行此操作的最简单方法是使用 python 模块的 scan()
帮助程序,它包装了 ElasticSearch Scroll API,因此您不必跟踪 _scroll_id
。与 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)
关于python - Elasticsearch python API : Delete documents by query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808239/