python - Elasticsearch python API : Delete documents by query

标签 python elasticsearch pyes pyelasticsearch

我看到以下 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/

相关文章:

python - 如何在 numpy 中获取两个索引数组之间的矩阵元素?

python - SSM 向 EC2 实例发送命令失败

elasticsearch - 如何在Elasticsearch中将术语过滤器与缺少的过滤器结合在一起?

django - 从 elasticsearch 返回的嵌套对象中检索特定字段

python - 如何使 pyes 搜索方法返回找到的文件的键?

python - 使用 Redis 添加重复任务

python - 如何在 Python 中对 IP 地址和整数进行排序?

elasticsearch - 获取整个索引的总词频(Elasticsearch)

elasticsearch - 在pdf和ppts上运行Elastic Search

python - 查询 DSL 在 pyes 搜索中不起作用