前两天有同事打电话问我,说ES删除数据有没有什么坑?

我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑。。。

后来想想,关于ES数据的删除,之前确实遇到过很多删除场景,如果真要说有没有所谓的坑,细想一下,还真有。

我维护过的ES集群最大规模是180多个节点,每天增量70亿条/10TB的日志数据,总容量2PB+,主要是提供各类日志的存储、检索和分析用的。
之前遇到过一个需求就是删除某些关键字的日志数据,时间区间是最近半年。
因为这个集群索引是按日志类型按天分的,半年有很多索引,根据用户提供的关键字搜了最近一个月的量居然有2亿条+,半年就是12亿+,从1万多亿条中删除12亿。。ohmyga~~

这种方式只能通过_delete_by_query方式进行删除,大数据量_delete_by_query的删除会导致响应超时,集群负载过高或不稳定等各种问题,所以不建议用这种方式删除大量的数据。

针对以上问题,我根据已有经验及网上资料,整理了一下ES的删除操作,算是对知识做个整理回顾吧

删除数据分为两种:一种是删除索引(数据和表结构同时删除,作用同MySQL中 DROP TABLE "表名" ),另一种是删除数据(不删除表结构,作用同MySQL中Delete 语句)。

一:删除索引:

删除单个索引可以使用命令 【DELETE /索引名称】

Delete 索引名称

删除多个索引可以使用命令 【DELETE /索引1,索引2】

Delete 索引名称1,索引名称2
【DELETE /testindex*】:删除以testindex 开头的所有索引文件(如果配置文件中禁止后此方式不能使用);

Delete 索引名称*

删除全部索引命令 【DELETE /_all】(配置文件中禁止后此方式不能使用) 或者 【DELETE /*】(配置文件中禁止后此方式不能使用)

  1. Delete _all

注意事项:对数据安全来说,能够使用单个命令来删除所有的数据可能会带来很可怕的后果,所以,为了避免大量删除,可以在elasticsearch.yml 配置文件中(或者动态配置中)修改 action.destructive_requires_name: true

设置之后只限于使用特定名称来删除索引,使用_all 或者通配符来删除索引无效(上述中说明配置文件中禁止后此方式不能使用)】

二:删除数据:

1.:根据主键删除数据:【DELETE /索引名称/类型名称/主键编号】

Delete 索引名称/文档名称/主键编号

2:根据匹配条件删除数据:(注意请求方式是Post)

  1. POST 索引名称/文档名称/_delete_by_query
  2. {
  3. "query":{
  4. "term":{
  5. "_id":100000100
  6. }
  7. }
  8. }

如果你想根据条件来删除你的数据,则在Query查询体中组织你的条件就可以了。
当启动时(开始要删除时),_delete_by_query会得到索引(数据库)的快照并且使用内部版本号来找到要删除哪些文档。这意味着,如果获取到快照与执行删除过程的这段时间,有文档发生改变,那么版本就会冲突。通过版本控制匹配到的文档会被删除。

因为internal版本控制不支持0为有效数字,所以版本号为0的文档不能删除,并且请求将会失败。

在执行_delete_by_query期间,为了删除匹配到的所有文档,多个搜索请求是按顺序执行的。每次找到一批文档时,将会执行相应的批处理请求来删除找到的全部文档。如果搜索或者批处理请求被拒绝,_delete_by_query根据默认策略对被拒绝的请求进行重试(最多10次)。达到最大重试次数后,会造成_delete_by_query请求中止,并且会在failures字段中响应 所有的故障。已经删除的仍会执行。换句话说,该过程没有回滚,只有中断。
在第一个请求失败引起中断,失败的批处理请求的所有故障信息都会记录在failures元素中;并返回回去。因此,会有不少失败的请求。
如果你想计算有多少个版本冲突,而不是中止,可以在URL中设置为conflicts=proceed或者在请求体中设置"conflicts": "proceed"。

3:删除所有数据:(注意请求方式是Post,只删除数据,不删除表结构)

  1. POST /testindex/testtype/_delete_by_query?pretty
  2. {
  3. "query": {
  4. "match_all": {
  5. }
  6. }
  7. }

好了,本文先说到这里,有问题欢迎留言讨论。

 

参考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
https://blog.csdn.net/u013066244/article/details/76258188

Elasticsearch删除数据操作,你必须知道的一些坑的更多相关文章

  1. elasticsearch(3) 数据操作-更新

    一 更新整个文档 更新整个文档的方法和存放数据的方式是相同的,通过PUT 127.0.0.1/test/test/1  我们可以把test/test/1下的文档更新为新的文档 例: PUT 127.0 ...

  2. Elasticsearch 删除数据

    删除数据分为两种:一种是删除索引(数据和表结构同时删除,作用同SQLSERVER 中 DROP TABLE "表格名" ),另一种是删除数据(不删除表结构,作用同SQLSERVER ...

  3. Elasticsearch删除数据之_delete_by_query

    es参考版本:elasticsearch:5.5 _delete_by_query会删除所有query语句匹配上的文档,用法如下: curl -X POST "localhost:9200/ ...

  4. jQuery实现表单动态添加与删除数据操作示例

    <!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8&q ...

  5. elasticsearch(2) 数据操作——查询

    一 文档 ES面向文档,并且使用JSON作为文档序列化格式,对于ES来说,文档特指根对象序列化成的JSON数据,以唯一ID标识并存储于ES中. 文档元数据 三个必须的元数据节点 1._index   ...

  6. MongoDB数据库中更新与删除数据

    MongoDB数据库中更新与删除数据 在MongoDB数据库中,可以使用Collection对象的update方法更新集合中的数据文档.使用方法如下所示: collection.update(sele ...

  7. Elasticsearch的数据导出和导入操作(elasticdump工具),以及删除指定type的数据(delete-by-query插件)

    Elasticseach目前作为查询搜索平台,的确非常实用方便.我们今天在这里要讨论的是如何做数据备份和type删除.我的ES的版本是2.4.1. ES的备份,可不像MySQL的mysqldump这么 ...

  8. 使用Python对ElasticSearch获取数据及操作

    #!/usr/bin/env python# -*- coding: utf-8 -*-""" @Time : 2018/7/4 @Author : LiuXueWen ...

  9. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

随机推荐

  1. mysql init password centos

    https://www.cnblogs.com/FlyingPuPu/p/7783735.html

  2. java后台表单字符串长度验证

    1.方法封装前提实体类属性去除首尾空白并进行反转义 //实体类属性的get方法 public String getContent() { if(!"".equals(字符串属性名) ...

  3. 扫描QPS控制——celery任务分多队列运行

    发包QPS控制,有两个难点. 1. redis交互流量的限制. 假设每分钟有1000条流量任务生成,每条跑20个插件,每个插件发5个数据包,每分钟约发十万请求. 那么在发包处做QPS会遇到一个问题,如 ...

  4. office+visio2016版本一同安装说明

    安装所需软件: Office或者visio镜像 比如:cn_visio_professional_2016_x86_x64_dvd_6970929.iso 下载网址:http://pan.baidu. ...

  5. 「ZJOI2014」力 FFT

    FFTl裸题,小于的部分直接做,大于的部分倒序后再做就行了. #include <bits/stdc++.h> using namespace std; const int MAXN = ...

  6. mybatis 批量删除添加

    mybatis使用foreach进行批量插入和删除操作   转发与    https://www.cnblogs.com/Amaris-Lin/p/8615977.html     一.批量插入 1. ...

  7. 指针&虚函数多态性

    class Class1 { public: virtual void f() { cout << "Function f() in Class1 \n"; } voi ...

  8. 005_linux驱动之_class_device_create函数

    (一)解析class_device_create函数   (二)当我们使用class_create创建一个类之后我们就可以使用class_device_create函数在这个类下面创建一个设备了,cl ...

  9. VUE 异步数据传递给 component props 的问题

    案例一 父组件parent.vue // asyncData为异步获取的数据,想传递给子组件使用 <template> <div> 父组件 <child :child-d ...

  10. docker 1.12

    curl https://releases.rancher.com/install-docker/1.12.sh | sh http://rancher.com/docs/rancher/v1.6/e ...