本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

想到删除,基础认知是delete,细分为删除文档(document)和删除索引;要删除历史数据,基础认知是:删除了给定条件的数据,用delete_by_query。
实际操作发现:

删除文档后,磁盘空间并没有立即减少,反而增加了?
除了定时任务+delete_by_query,有没有更好的方式呢?

2、常见的删除操作

2.1 删除单个文档

DELETE /twitter/_doc/1

2.2 删除满足给定条件的文档

POST twitter/_delete_by_query
  "query": { 
    "match": {
      "message": "some message"

注意:执行批量删除的时候,可能会发生版本冲突。强制执行删除的方式如下:

POST twitter/_doc/_delete_by_query?conflicts=proceed
  "query": {
    "match_all": {}

2.3 删除单个索引

DELETE /twitter

2.4 删除所有索引

DELETE /_all
DELETE /*

删除所有索引是非常危险的操作,要注意谨慎操作。

3、删除文档后台做了什么?
执行删除后的返回结果:

"_index": "test_index", "_type": "test_type", "_id": "22", "_version": 2, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 "_seq_no": 2, "_primary_term": 17

索引的每个文档都是版本化的。
删除文档时,可以指定版本以确保我们试图删除的相关文档实际上被删除,并且在此期间没有更改。

每个在文档上执行的写操作,包括删除,都会使其版本增加

真正的删除时机:

deleting a document doesn’t immediately remove the document from disk; it just marks it as >deleted. Elasticsearch will clean up deleted documents in the background as you continue to index more data.

4、删除索引和删除文档的区别?

1)删除索引是会立即释放空间的,不存在所谓的“标记”逻辑。

2)删除文档的时候,是将新文档写入,同时将旧文档标记为已删除。 磁盘空间是否释放取决于新旧文档是否在同一个segment file里面,因此ES后台的segment merge在合并segment file的过程中有可能触发旧文档的物理删除。

但因为一个shard可能会有上百个segment file,还是有很大几率新旧文档存在于不同的segment里而无法物理删除。想要手动释放空间,只能是定期做一下force merge,并且将max_num_segments设置为1。

POST /_forcemerge

5、如何仅保存最近100天的数据?

有了上面的认知,仅保存近100天的数据任务分解为:

  • 1)delete_by_query设置检索近100天数据;
  • 2)执行forcemerge操作,手动释放磁盘空间。
  • 删除脚本如下:

    #!/bin/sh
    curl -H'Content-Type:application/json' -d'{
        "query": {
            "range": {
                "pt": {
                    "lt": "now-100d",
                    "format": "epoch_millis"
    ' -XPOST "http://192.168.1.101:9200/logstash_*/
    _delete_by_query?conflicts=proceed"

    merge脚本如下:

    #!/bin/sh
    curl -XPOST 'http://192.168.1.101:9200/_forcemerge?
    only_expunge_deletes=true&max_num_segments=1'

    6、有没有更通用的方法?

    有,使用ES官网工具——curator工具。

    6.1 curator简介

    主要目的:规划和管理ES的索引。支持常见操作:创建、删除、合并、reindex、快照等操作。

    6.2 curator官网地址

    http://t.cn/RuwN0oM

    Git地址:https://github.com/elastic/curator

    6.3 curator安装向导

    地址:http://t.cn/RuwCkBD

    注意:
    curator各种博客教程层出不穷,但curator旧版本和新版本有较大差异,建议参考官网最新手册部署。
    旧版本命令行方式新版本已不支持。

    6.4 curator命令行操作

    $ curator --help
    Usage: curator [OPTIONS] ACTION_FILE
      Curator for Elasticsearch indices.
      See http://elastic.co/guide/en/elasticsearch/client/curator/current
    Options:
      --config PATH  Path to configuration file. Default: ~/.curator/curator.yml
      --dry-run      Do not perform any changes.
      --version      Show the version and exit.
      --help         Show this message and exit.

    核心:
    --配置文件config.yml:配置要连接的ES地址、日志配置、日志级别等;

    • 执行文件action.yml: 配置要执行的操作(可批量)、配置索引的格式(前缀匹配、正则匹配方式等)

    6.5 curator适用场景

    最重要的是:

  • 仅以删除操作为例:curator可以非常简单地删除x天后的索引的前提是:索引命名要遵循特定的命名模式——如:以天为命名的索引:logstash_2018.04.05。
  • 命名模式需要和action.yml中的delete_indices下的timestring对应。
  • 多参考官网最新的文档,历史版本的历史文档很容易误导人;
  • 多真正去实践,而不是仅限于知道;
  • medcl:ES新版本6.3 有一个 Index LifeCycle Management 可以很方便的管理索引的保存期限。
  • [1]http://t.cn/RuwOTv
    [2]http://t.cn/RuwXHBr
    [3]http://t.cn/RuwOofC

    作者:铭毅天下
    转载请标明出处,原文地址:
    https://blog.csdn.net/laoyang360/article/details/80038930

    ElasticSearch 入门精讲
    ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
    elasticsearch 怎么删除过期的数据
    使用elasticsearch收集日志进行处理,时间久了,很老的数据就没用了或者用途不是很大,这个时候就要对过期数据进行清理.但是es5.0之后就不支持ttl,那怎么办呢? 1,请使用官方的工具elasticsearch-curator 2,使用delete-by-query方法删除特定时间范围的数据 第一种这里不再介绍了,直接看官网吧,主要说下第二种
    JasonLee实时计算 探究 | Elasticsearch 与传统数据库界限
    现在几乎网上所有资料都说数据存储在传统数据库,再在 es 中同步一份数据作为检索使用,但是也都没有很详细的说明为什么要这么做,而且在 es 本身可以存储数据的情况下,存储两份数据是不是没有必要?还会引起别的问题。 虽然收费而且支持的语法不完全,但是在现在 es 已经支持 sql 的情况下,我越来越搞不清楚 es 和数据库之间的界限。 es 不支持事务但是能够确保单条数据的写入,这样事务可以通过代码实现。很难进行联合查询可以像其他 nosql 一样用宽表实现。实时性可以通过配置调整,而在扩展性能和复杂统计上肯定 es 更优。 基于以上疑问,请问现阶段 es 与数据库的区别或者说界限到底在哪
    想到删除,基础认知是delete,细分为删除文档(document)和删除索引;要删除历史数据,基础认知是:删除了给定条件的数据,用delete_by_query。 实际操作发现: - 删除文档后,磁盘空间并没有立即减少,反而增加了? - 除了定时任务+delete_by_query,有没有更好的方式呢? 基于Elasticsearch向量检索的以文搜图 Elasticsearch 基础检索(全文检索/多语言搜索/地理位置查询) 基于Kibana Discover筛选数据,自由搜索航班信息 使用检索分析服务Elasticsearch版实现基础检索 基于工具的数据探查 如何对PolarDB-X的存储节点发起备库重搭