ElasticSearch删除索引中的数据(delete_by_query)

这篇具有很好参考价值的文章主要介绍了ElasticSearch删除索引中的数据(delete_by_query)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、删除两个月以前的数据

在 Elasticsearch 中,要删除两个月以前的数据,可以通过以下步骤:

计算当前时间的两个月前的日期,可以使用 Python 的 datetime 模块来实现。

import datetime

# 获取当前日期
now = datetime.datetime.now()

# 计算两个月前的日期
two_months_ago = now - datetime.timedelta(days=60)

构造 Elasticsearch 的删除请求,使用 Elasticsearch-Py 库来与 Elasticsearch 进行交互。

from elasticsearch import Elasticsearch

# 创建 Elasticsearch 连接
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

# 构造删除请求
delete_query = {
    "query": {
        "range": {
            "timestamp": {
                "lt": two_months_ago.strftime("%Y-%m-%dT%H:%M:%S")  # 格式化日期为 Elasticsearch 支持的格式
            }
        }
    }
}

# 发送删除请求
es.delete_by_query(index='your_index_name', body=delete_query)

        这样就可以删除索引中两个月以前的数据。需要注意的是,删除数据操作是不可逆的,请谨慎使用,并在生产环境中进行充分的测试。另外,具体的索引命名、字段名和日期字段名等需要根据你的实际情况进行修改。

2、通过别名删除数据

        可以使用 Elasticsearch 的别名(Alias)来一次性删除多个索引中的数据。别名可以理解为对一个或多个索引的引用,可以对别名进行删除操作,从而同时删除多个索引的数据。

下面是使用 Elasticsearch-Py 库来一次性删除多个索引中数据的示例代码:

from elasticsearch import Elasticsearch

# 创建 Elasticsearch 连接
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

# 定义要删除数据的索引别名
index_alias = "your_index_alias"

# 构造删除请求
delete_query = {
    "query": {
        "range": {
            "timestamp": {
                "lt": "now-2M"  # 删除两个月以前的数据
            }
        }
    }
}

# 发送删除请求,并指定索引别名
es.delete_by_query(index=index_alias, body=delete_query)

        在这个示例中,我们使用了 index_alias 变量来指定要删除数据的索引别名,然后通过 es.delete_by_query() 方法发送删除请求,并在其中指定了要删除的数据范围,这里使用了 Elasticsearch 的日期数学计算表达式 "now-2M" 来表示两个月以前的时间点。这样,所有与该别名关联的索引中两个月以前的数据都会被删除。

        需要注意的是,使用别名删除索引中的数据是一个强大的操作,务必谨慎使用,并在生产环境中进行充分的测试。同时,具体的索引别名和字段名等需要根据你的实际情况进行修改。

3、是否属于逻辑删除

        使用 Elasticsearch 的 delete_by_query 方法删除索引中的数据并不属于逻辑删除。它实际上是执行了一次查询操作,然后在查询结果的基础上执行删除操作,将满足查询条件的文档从索引中物理删除。

        逻辑删除通常是通过在文档中添加一个标志字段(例如 deleted),并将其设置为 true 表示被标记为删除,然后在查询时过滤掉这些标记为删除的文档,从而实现逻辑删除的效果。这样的做法可以保留已删除文档的历史记录,方便后续恢复或查询需求。

        而使用 delete_by_query 方法则是直接从索引中物理删除满足查询条件的文档,这些文档将无法被恢复,并且删除操作会在 Elasticsearch 中产生一定的开销和影响性能。因此,在使用 delete_by_query 方法时,需要谨慎考虑,并在生产环境中进行充分的测试和验证。

4、删除数据后是否还占用存储空间

        在 Elasticsearch 中,当使用 delete_by_query 方法删除文档时,这些文档实际上会被标记为已删除,但并不会立即从磁盘上删除。而是在后续的段合并(segment merge)操作中,才会将这些已删除的文档从磁盘上清除。

        因此,虽然使用 delete_by_query 方法删除了文档,但这些文档仍然会占用存储空间,直到段合并操作被触发并完成。这也意味着,即使使用 delete_by_query 方法删除了大量文档,磁盘上的存储空间并不会立即释放,而是需要等待段合并操作进行清理。

        在 Elasticsearch 7.x 及以上版本中,已经引入了新的 _delete_by_query API,它可以在删除文档时通过 refresh 参数进行实时刷新(默认情况下,Elasticsearch 会定期执行刷新操作以确保数据持久化到磁盘)。这样可以更快地释放存储空间,但仍然需要注意潜在的性能和存储影响。在使用 delete_by_query 方法时,建议在生产环境中谨慎操作,并在删除大量数据时密切监控存储空间的使用情况。

5、大数据存储使用delete_by_query方法是否有影响

        对于大量数据的删除,使用 delete_by_query 方法可能会对性能和存储空间造成一定的影响。因为 delete_by_query 方法需要在 Elasticsearch 中执行查询操作,并对匹配的文档进行标记删除,而这些标记删除的文档仍然会占用存储空间,并需要在后续的段合并操作中清理。

        对于大量数据的删除,推荐使用更高效的方法,例如通过删除整个索引或者使用 Elasticsearch 的时间戳索引(time-based index)来定期删除旧数据。这样可以避免使用 delete_by_query 方法对查询和存储空间造成过大的压力。

例如,可以考虑以下几种方法:

  • 删除整个索引:如果要删除的数据较为庞大且时间上有明确的范围,可以直接删除整个索引。例如,每个月一个索引,当某个索引中的数据超过两个月时,直接删除这个索引。
  • 使用 Elasticsearch 的时间戳索引:可以将数据按照时间戳等时间信息进行分散存储在不同的索引中,例如每天或每小时一个索引。当数据过期时,只需删除相应的索引,从而实现快速删除大量数据。

        以上方法都可以避免使用 delete_by_query 方法对性能和存储空间造成潜在的影响,适用于大量数据的删除场景。需要根据具体的业务需求和数据规模选择合适的删除策略。文章来源地址https://www.toymoban.com/news/detail-439533.html

到了这里,关于ElasticSearch删除索引中的数据(delete_by_query)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot Elasticsearch7.6.2实现创建索引、删除索引、判断索引是否存在、获取/添加/删除/更新索引别名、单条/批量插入、单条/批量更新、删除数据、递归统计ES聚合的数据

    注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6 引入依赖 有时候你可能需要查询大批量的数据,建议加上下面配置文件

    2024年02月13日
    浏览(70)
  • Mysql 数据库DML 数据操作语言—— 对数据库表中的数据进行更改UPDATE 和删除DELETE

        delete语句可以有条件,也可以没有,如果没有条件的话就是删除整张表 delete不可以删除表中某一个字段的值,但是update可以; 

    2024年01月19日
    浏览(51)
  • ES删除索引中的所有数据(不删除索引结构)含curl删除方式

    场景:想只删除索引下的数据,不删除索引结构,(windows环境)服务器中没有postman工具 第一种:只删除索引中的所有数据,不删除索引结构 第二种:删除索引中的指定的数据,不删除索引结构 第三种:删除所有数据,删除索引结构 windows环境中curl方式删除 第一种:删除所有

    2024年02月11日
    浏览(42)
  • C语言 - 删除数组中的指定元素(Delete)

    目录   引言: 题目说明: 举例分析: 初始状态: step 1:  Step 2:  Step 3 :  Step 4 :  将最后一个元素赋值为0  Step 5 :将i下标向前迁移一位(重复判断): 代码实现:  总结:   这是数组中一个比较简单的题目,今天把它单独拎出来的原因就是在我即将要写的数据结构的顺

    2023年04月09日
    浏览(48)
  • 深入理解DELETE请求:探索HTTP中的资源删除操作

    DELETE请求是HTTP协议中一种重要的请求方法,用于删除指定的资源。在Web开发中,DELETE请求被广泛应用于与数据库或文件系统交互的操作,如删除用户、删除文章等。本博客将深入探讨DELETE请求的作用、特点和用法,并与其他HTTP请求方法进行比较。 DELETE请求是HTTP协议中用于删

    2024年02月08日
    浏览(49)
  • Elasticsearch集群索引写入失败[FORBIDDEN/12/index read-only / allow delete (api)]处理流程

    操作系统:CentOS 7.3 软件版本:elasticsearch-6.7.2 正常将数据写入到Elasticsearch时,发现写入失败,出现如下报错 检查Elasticsearch集群的active master节点的日志,并没有发现error,但有WARN告警,显示与 flood stage disk watermark [90%] 有关。 上下文有 low disk watermark [80%] 的INFO日志信息,再次

    2024年02月10日
    浏览(58)
  • elasticsearch索引操作,索引创建、索引更新、索引删除

    创建索引 更新索引,添加字段 注意更新索引时与创建索引大致一样,只是更新索引时候的url不同,需要在后面加一个 _mapping 路径,同时请求的json里面不需要 mappings 路径,只需要 properties 即可 更新索引,修改配置 同理在更新setting的时候和更新maping的时候一样 获取索引结构

    2024年02月11日
    浏览(43)
  • ElasticSearch删除索引的命令

    ElasticSearch删除索引的命令 当前命令操作是在Kibana中操作 删除单个索引 DELETE 索引名称 删除多个索引 DELETE 索引名称1,索引名称2 删除全部索引 删除索引的中的全部数据 注意 Elasticsearch查询删除的时候,不是立即删除。在执行删除操作时,Elasticsearch会先将要删除的文档标记为

    2024年04月15日
    浏览(49)
  • ElasticSearch定期删除索引

    项目中使用EFK进行日志管理,因磁盘空间有限,故有如下需求: 日志保留60天 超过60天的,能够自动删除 通过查阅资料发现,可以使用 索引生命周期策略 来实现。 索引生命周期策略主要包含如下几种情况: 热阶段(必需):将最近的、搜索最频繁的数据存储在热层中。热

    2024年02月15日
    浏览(42)
  • ElasticSearch删除索引【真实案例】

    项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以临时的解决办法是:删除这些没有使用的ES索引数据。 ElasticSearch提供了Web API可以删除索引。详见 删除索引

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包