从 ElasticSearch 中删除旧数据

25
如何从Elasticsearch索引中删除旧数据,因为每天都有大量数据插入到索引中。

1
为什么这个问题被踩了? - slim
3个回答

22
你可以使用插件delete by query来完成这个操作。
假设你的索引中有一些timestamp或者creation date字段,那么你的查询语句应该长成这个样子。
DELETE /your_index/your_type/_query
{
  "query": {
    "range": {
      "timestamp": {
        "lte": "now-10y"
      }
    }
  }
}

这将删除10年前的记录。

希望这能帮到你。


有没有办法以脚本的形式来实现,这样我们就不必手动运行查询了? - sri
这个删除查询会完全从索引中擦除记录,并为新的记录腾出空间吗? - sri
1
你可以设置一个cron job每天执行,删除记录后它们不会被彻底清除,而是被标记为已删除,在段合并期间它们才会被真正地移除。在删除或更新后,你可能会看到索引大小的增加,你可以使用force merge来优化你的索引。 - ChintanShah25
什么是段合并?段合并后索引的大小是否会减小? - sri
1
阅读此链接以了解段合并,您不能像那样减小大小,只有在合并段后删除的数据才不会存在。此外,阅读关于Elasticsearch如何工作的文章,以获得更好的理解。链接如下:https://www.elastic.co/blog/found-elasticsearch-from-the-bottom-up - ChintanShah25

12

将数据拆分为每日索引,并使用别名作为旧索引名称。然后按每天删除每个索引,就像logstash一样:

每日索引:logstash-20151011logstash-20151012logstash-20151013

完整别名:logstash

然后每天都删除最后一个索引。


2
使用多个索引是正确的方法。要删除旧索引,您可以使用Curator:https://www.elastic.co/guide/en/elasticsearch/client/curator/current/index.html - slim
1
这是最佳答案。 - Luc E

0
如果您正在使用基于时间的索引,那么应该是这样的:
curl -XDELETE http://localhost:9200/test-2017-06

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接