问题:
最近我在使用elasticsearch 5.1版本,用python调用delete_by_query根据已知条件过滤数据并删除的时候,出现如下问题
调用代码:
from elasticsearch import Elasticsearch
ES = Elasticsearch(ES_SEARCH_HOSTURL)
ES.delete_by_query(dsl)
查看官方网站说明: 提示说2.x版本将这个功能删除了,原因是调用这个接口容易出现一些很意外的错误,如果特别想使用的话,可以安装插件来解决;但是5.x版本已经重新考虑将此功能加入并实现,见下图
官方已经提供相关测试用例,说明确实实现了啊,那为啥python调用那个函数执行会报错呢,这个就值得探讨一下了;首先根据官方提示,使用POST请求URL的方式,进行在linux终端下请求,发现确实 _delete_by_query 可用,这尼玛什么神奇操作,python就是不能调用呢?
最后总结得出结论: python2.7对此接口封装的有问题
其实按照搜索条件,将需要删除的数据的_id过滤出来,再调用delete函数一条一条删除,也能实现,但是这个一旦需要删除的数据量比较大的话,这个方式就有点捉襟见肘了,慢出新高度
灵机一动,可以换种思路来实现呀,思路就是以requests POST请求urL的形式,不就达到同样效果了嘛,具体代码见下:
import requests
# 其中doc_type_name如果没有的话,表示直接操作对象是整个索引
url = 'http://localhost:9200/index_name/doc_type_name/_delete_by_query'
query = DSL # 就是安装DSL规范写的字典
result = requests.post(url=url, json=query)
result = result.json()
print(result)
不知道各位同仁有没有遇到类似问题,分享出来希望能帮助掉进抗里面的人