Elasticsearch 的文档删除策略是基于 Lucene 的标记删除机制,也称为 " 懒惰删除 "。当一个文档被删除时,它并不会立即从磁盘中删除,而是被标记为已删除状态。在某些情况下,这个文档可能仍然需要被查询到,例如在执行倒排索引合并时,需要将已删除的文档的信息与新添加的文档进行合并,以获取最终的倒排表。
因此,Elasticsearch 会定期运行一个删除过期文档的后台线程(默认为每小时一次),该线程会扫描已经被标记为删除的文档,并根据一定的规则来彻底删除这些文档。
具体来说,Elasticsearch 使用了两个重要参数来控制文档删除:
index.merge.policy.expunge_deletes_allowed
:这个参数用来控制何时删除已标记为删除的文档。当已标记为删除的文档达到一定数量时,Elasticsearch 就会启动一个合并线程来清除这些文档。默认情况下,该参数的值是 10%,也就是当已删除的文档的数量达到了当前段文档数量的 10% 时,就会启动一个合并线程。
index.merge.policy.max_merged_segment
:这个参数用来控制合并线程合并后的段大小。如果一个合并线程合并后的段大小超过了该参数的值,那么这个线程就会停止。默认情况下,该参数的值是 5GB。
需要注意的是,文档删除并不会立即释放磁盘空间,因为标记删除只是将文档标记为已删除状态,而不是完全删除。如果你需要彻底删除某个索引中的所有文档,可以使用 Elasticsearch 提供的清除缓存 API,该接口会清除该索引的所有缓存和已删除文档。