在使用 Elasticsearch 的过程中,经常会有删除某个索引历史数据的需求。比如存储飞机票信息的索引,通常只需要保留今日及今日之后的机票信息。为提升索引的效率和防止索引过大,同时尽量避免删除过程中影响线上环境稳定性,一般会选在业务低峰期的时候删除历史数据。

如以下 DSL 通过调用 _delete_by_query 方法删除 flight_v20220107 索引中日期(dt)在 20220729 ~ 20220802 之间的机票信息数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /flight_v20220107/_delete_by_query?size=1000000&conflicts=proceed
{
"query": {
"bool": {
"filter": {
"range": {
"dt": {
"from": "20220729",
"to": "20220802"
}
}
}
}
}
}

但在执行完删除命令之后,并不会马上释放该索引的存储大小。因为在 Elasticsearch 中,删除文档并不是真正的删除,而是将这些文档标记为已删除,使它们不会被搜索到而已。如果要回收磁盘空间,释放索引的存储大小,还必须优化索引,即使用 _forcemerge 命令合并段减少分片中段数量、删除冗余数据。

1
POST /flight_v20220107/_forcemerge?only_expunge_deletes=true

_forcemerge 命令说明:

  • 优化所有索引:
    1
    POST /_forcemerge?only_expunge_deletes=true
  • 优化单个索引(其中 index_name 为索引名称):
    1
    POST /index_name/_forcemerge?only_expunge_deletes=true
  • 优化多个索引(其中 index_name_1index_name_2 为索引名称):
    1
    POST /index_name_1,index_name_2/_forcemerge?only_expunge_deletes=true

(END)