文章转载自:

https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484022&idx=1&sn=7a4de21570820b82df0170b3c769b169&chksm=eaa82a5edddfa348b3e300ac4bc611ab32a5e6024d20ef7a3cb297a42483fd60f0f459dd33ad&scene=21#wechat_redirect

01 题记

想到删除,基础认知是delete,细分为删除文档(document)和删除索引;要删除历史数据,基础认知是:删除了给定条件的数据,用delete_by_query。

实际操作发现:

删除文档后,磁盘空间并没有立即减少,反而增加了?

除了定时任务+delete_by_query,有没有更好的方式呢?

02 常见的删除操作

2.1 删除单个文档

1DELETE /twitter/_doc/1

2.2 删除满足给定条件的文档

1POST twitter/_delete_by_query

2{

3 "query": {

4 "match": {

5 "message": "some message"

6 }

7 }

8}

注意:执行批量删除的时候,可能会发生版本冲突。强制执行删除的方式如下:

1POST twitter/_doc/_delete_by_query?conflicts=proceed

2{

3 "query": {

4 "match_all": {}

5 }

6}

2.3 删除单个索引

1DELETE /twitter

2.4 删除所有索引

1DELETE /_all

或者

1DELETE /*

删除所有索引是非常危险的操作,要注意谨慎操作。

03 删除文档后台做了什么?

执行删除后的返回结果:

1{

2 "_index": "test_index",

3 "_type": "test_type",

4 "_id": "22",

5 "_version": 2,

6 "result": "deleted",

7 "_shards": {

8 "total": 2,

9 "successful": 1,

10 "failed": 0

11 },

12 "_seq_no": 2,

13 "_primary_term": 17

14}

解读:

索引的每个文档都是版本化的。

删除文档时,可以指定版本以确保我们试图删除的相关文档实际上被删除,并且在此期间没有更改。

每个在文档上执行的写操作,包括删除,都会使其版本增加。

真正的删除时机:

deleting a document doesn’t immediately remove the document from disk; it just marks it as deleted. Elasticsearch will clean up deleted documents in the background as you continue to index more data.

04 删除索引和删除文档的区别?

1)删除索引是会立即释放空间的,不存在所谓的“标记”逻辑。

2)删除文档的时候,是将新文档写入,同时将旧文档标记为已删除。 磁盘空间是否释放取决于新旧文档是否在同一个segment file里面,因此ES后台的segment merge在合并segment file的过程中有可能触发旧文档的物理删除。

但因为一个shard可能会有上百个segment file,还是有很大几率新旧文档存在于不同的segment里而无法物理删除。想要手动释放空间,只能是定期做一下force merge,并且将max_num_segments设置为1。

1POST /_forcemerge

05 如何仅保存最近100天的数据?

有了上面的认知,仅保存近100天的数据任务分解为:

1)delete_by_query设置检索近100天数据;

2)执行forcemerge操作,手动释放磁盘空间。

删除脚本如下:

1#!/bin/sh

2curl -H'Content-Type:application/json' -d'{

3 "query": {

4 "range": {

5 "pt": {

6 "lt": "now-100d",

7 "format": "epoch_millis"

8 }

9 }

10 }

11}

12' -XPOST "http://192.168.1.101:9200/logstash_*/

13_delete_by_query?conflicts=proceed"

merge脚本如下:

1#!/bin/sh

2curl -XPOST 'http://192.168.1.101:9200/_forcemerge?

3only_expunge_deletes=true&max_num_segments=1'

06 有没有更通用的方法?

有,使用ES官网工具——curator工具。

6.1 curator简介

主要目的:规划和管理ES的索引。支持常见操作:创建、删除、合并、reindex、快照等操作。

6.2 curator官网地址

http://t.cn/RuwN0oM

Git地址:https://github.com/elastic/curator

6.3 curator安装向导

地址:http://t.cn/RuwCkBD

注意:

curator各种博客教程层出不穷,但curator旧版本和新版本有较大差异,建议参考官网最新手册部署。

旧版本命令行方式新版本已不支持。

6.4 curator命令行操作

1$ curator --help

2Usage: curator [OPTIONS] ACTION_FILE

3 Curator for Elasticsearch indices.

4 See http://elastic.co/guide/en/elasticsearch/client/curator/current

5Options:

6 --config PATH Path to configuration file. Default: ~/.curator/curator.yml

7 --dry-run Do not perform any changes.

8 --version Show the version and exit.

9 --help Show this message and exit.

核心:

配置文件config.yml:配置要连接的ES地址、日志配置、日志级别等;

执行文件action.yml: 配置要执行的操作(可批量)、配置索引的格式(前缀匹配、正则匹配方式等)

6.5 curator适用场景

最重要的是:

仅以删除操作为例:curator可以非常简单地删除x天后的索引的前提是:索引命名要遵循特定的命名模式——如:以天为命名的索引:logstash_2018.04.05。

命名模式需要和action.yml中的delete_indices下的timestring对应。

07 小结

多参考官网最新的文档,历史版本的历史文档很容易误导人;

多真正去实践,而不是仅限于知道;

medcl:ES新版本6.3 有一个 Index LifeCycle Management 可以很方便的管理索引的保存期限。

Elasticsearch删除操作详解的更多相关文章

  1. c++排序二叉树的出现的私有函数讨论,以及二叉树的删除操作详解

    c++排序二叉树的出现的私有函数讨论, 以及二叉树的删除操作详解 标签(空格分隔): c++ 前言 我在c++学习的过程中, 最近打了一个排序二叉树的题目,题目中出现了私有函数成员,当时没有理解清楚这 ...

  2. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  3. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  4. shell字符串操作详解

    shell字符串操作详解的相关资料. 1.shell变量声明的判断  表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...

  5. memcached 命令操作详解

    memcached 命令操作详解 一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> < ...

  6. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  7. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

  8. B树和B+树的插入、删除图文详解(good)

    B树和B+树的插入.删除图文详解 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数 ...

  9. SVN的Windows和Linux客户端操作详解

    SVN的Windows和Linux客户端操作详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Windows客户端操作 1.安装SVN客户端 a>.去官网下载svn软件 ...

随机推荐

  1. [System.OutOfMemoryException] {函数求值已禁用,因为出现内存不足异常。

    [System.OutOfMemoryException] {函数求值已禁用,因为出现内存不足异常. StringBuilder 赋值的时候超过内存的大小,要即时去清空文本的值. 也可能是DataSe ...

  2. Docker详解(上)

    Docker 学习 Docker概述 Docker安装 Docker命令 镜像命令 容器命令 操作命令 ... Docker镜像 容器数据卷 DockerFile Docker网络原理 IDEA整合D ...

  3. VIM编辑器的宏操作

    这两天看到一个小练习,要求如下: 在GVIM下,将下面这张图的内容 改成下面这样 并且指出,要用批量操作的方式,不能一行一行的键入 其实第一反应是利用正则表达式来操作,但是让用正则表达式以外的操作方式 ...

  4. 如何在 pyqt 中实现桌面歌词

    前言 酷狗.网抑云和 QQ 音乐都有桌面歌词功能,这篇博客也将使用 pyqt 实现桌面歌词功能,效果如下图所示: 代码实现 桌面歌词部件 LyricWidget 在 paintEvent 中绘制歌词. ...

  5. Vue3:不常用的Composition API && Fragment、Teleport、Suspense && 与Vue2对比的一些变化

    1 # 一.Vue3不常用的Composition API 2 # 1.shallowReactive与shallowRef 3 .shallowReactive: 只处理对象最外层属性的响应式(浅响 ...

  6. 从-99打造Sentinel高可用集群限流中间件

    接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...

  7. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(10)-Fiddler如何设置捕获Firefox浏览器的Https会话

    1.简介 经过上一篇对Fiddler的配置后,绝大多数的Https的会话,我们可以成功捕获抓取到,但是有些版本的Firefox浏览器仍然是捕获不到其的Https会话,需要我们更进一步的配置才能捕获到会 ...

  8. 新一代大数据任务调度系统 - Apache DolphinScheduler 1.3.4 发布,推荐下载

    | 本文编辑:朱桐 新一代大数据任务调度 - Apache DolphinScheduler(incubator) 在经过社区 30 多位小伙伴的贡献与努力下于发布了 1.3.4 版本,1.3.4 作 ...

  9. MyBatis 01 概述

    官网 http://www.mybatis.org/mybatis-3/zh/index.html GitHub https://github.com/mybatis/mybatis-3 简介 MyB ...

  10. java-分支重载以及构造方法

    1:方法的签名: 方法名+参数列表就是一个方法的签名 2.方法的重载(Overload): 1)发生在同一个类中,方法名称相同,参数列表不同 2)编译器在编译时会根据方法的签名自动绑定方法 3.构造方 ...