Elasticsearch中docs.deleted 这个里面的数据怎么彻底删掉呢?[阿里云检索分析服务 Elasticsearch版]

Elasticsearch中docs.deleted 这个里面的数据怎么彻底删掉呢?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
2 条回复 A 作者 M 管理员
  1. 您可以使用以下命令来删除Elasticsearch中的docs.deleted数据:

    POST /_delete_by_query{  "query": {    "term": {      "deleted": true    }  }}

    这将逻辑删除所有已标记为deleted的文档。但是,这只是逻辑删除,磁盘空间仍然占用。只有当数据量达到一定时,段文件合并时,才可能物理删除。

  2. 在Elasticsearch中,要彻底删除一个文档(document)的数据,可以使用以下两个方法:

    1. 使用delete API删除文档数据:

    DELETE /my_index/_doc/{  "doc": {    "field1": "value1",    "field2": "value2"  }}

    其中,是要删除的文档的ID。此API将删除指定文档并释放相关存储空间。

    1. 在索引映射中设置 doc_as_upsert=true参数:

    PUT my_index/_mapping{  "properties": {    "": {      "type": "text",      "doc_as_upsert": true    }  }}

    这会告诉Elasticsearch将每个文档视为更新而不是插入。当您向具有此属性的索引添加新文档时,如果该文档已存在,则它将被替换。如果您尝试插入一个已经存在的文档,则不会发生任何操作。因此,如果您要删除一个文档,只需将其插入到索引中即可。

  3. Delete By Query 删除原理: Delete_by_query并不是真正意义上物理文档删除,而是只是版本变化并且对文档增加了删除标记。当我们再次搜索的时候,会搜索全部然后过滤掉有删除标记的文档。因此,该索引所占的空间并不会随着该API的操作磁盘空间会马上释放掉,只有等到下一次段合并的时候才真正被物理删除,这个时候磁盘空间才会释放。相反,在被查询到的文档标记删除过程同样需要占用磁盘空间,这个时候,你会发现触发该API操作的时候磁盘不但没有被释放,反而磁盘使用率上升了。 ②使用Delete By Query 删除API注意事项: 1, 一般生产环境中,使用该API操作的索引都很大,文档都是千万甚至数亿级别。索引大小在几百G甚至几个T,因此,这个操作建议在业务低峰期或者晚上进行操作,因为大数据量情况下删除的需要消耗较多的i/o CPU 资源,容易对生产集群造成影响。 2,在删除过程中要确定集群磁盘有一定的余量,因为标记删除需要占用磁盘空间。如果磁盘空间不够,这个操作的失败率还是很大的。 3,Delete By Query有很多配置参数,这里不详解,具体可以参考文档:

    ③_forcemerge 命令可强制进行segment合并,并删除所有标记为删除的文档。Segment merging要消耗CPU,以及大量的I/O资源,所以一定要在你的ElasticSearch集群处于维护窗口期间,并且有足够的I/O空间的(如:SSD)的条件下进行;否则很可能造成集群崩溃和数据丢失.<这个非常重要> 执行上面2个步骤,整个流程就基本操作完毕,其它工作交给系统自动完成。时间待定。期间你会发现,磁盘空间会有一个反复变化的过程,磁盘使用率会先增长,然后在删除释放空间这样一个过程。这个过程无需紧张,都是正常现象。 以上就是整个批量删除和强制段合并操作实列。 curl -X POST “127.0.0.1:9200/对应索引/_forcemerge 此答案整理自钉钉群“Elasticsearch中文技术社区”