前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch深入:索引中Deleted操作

Elasticsearch深入:索引中Deleted操作

原创
作者头像
HLee
修改2021-11-10 10:16:05
1.2K0
修改2021-11-10 10:16:05
举报
文章被收录于专栏:房东的猫房东的猫

简介

Head 插件索引文档数显示结果不一致

索引中大量文档状态是 deleted

代码语言:javascript
复制
{
    "_shards":{
        "total":12,
        "successful":12,
        "failed":0
    },
    "_all":{
        "primaries":{
            "docs":{
                "count":94830,
                "deleted":13143
            },
            "store":{
                "size_in_bytes":1838486334,
                "throttle_time_in_millis":0
            },
            "refresh":{
                "total":8678,
                "total_time_in_millis":54815
            },
            "flush":{
                "total":1831,
                "total_time_in_millis":103795
            },
            "query_cache":{
                "memory_size_in_bytes":428848,
                "total_count":770522,
                "hit_count":271827,
                "miss_count":498695,
                "cache_size":211,
                "cache_count":279,
                "evictions":68
            },
            "segments":{
                "count":96,
                "memory_in_bytes":2944151,
                "terms_memory_in_bytes":2510183,
                "stored_fields_memory_in_bytes":118080,
                "term_vectors_memory_in_bytes":194392,
                "norms_memory_in_bytes":62912,
                "doc_values_memory_in_bytes":58584,
                "index_writer_memory_in_bytes":0,
                "index_writer_max_memory_in_bytes":3072000,
                "version_map_memory_in_bytes":0,
                "fixed_bit_set_memory_in_bytes":0
            },
            "translog":{
                "operations":1,
                "size_in_bytes":303
            },
            "recovery":{
                "current_as_source":0,
                "current_as_target":0,
                "throttle_time_in_millis":269174
            }
        }
    }
}

Deleted 本质

  • _id 代表的唯一 id
  • _version 代表的文档的版本号
代码语言:javascript
复制
PUT test/_doc/1
{
    "counter" : 1,
    "province" : "北京"
}

结果:
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 10,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_version" : 1, # 版本号
        "_score" : 1.0,
        "_source" : {
          "counter" : 1,
          "province" : "北京"
        }
      }
    ]
  }
}

此时查看文档的version都是1,假如我们再次执行一下更新id为1的文档:

代码语言:javascript
复制
PUT test/_doc/1
{
    "counter" : 1,
    "province" : "北京"
}

结果:
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2, # 版本号变为了2
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}
代码语言:javascript
复制
GET test/_stats

# "count" : 0, "deleted" : 1

假如执行 delete 操作后,看下 version 结果:

代码语言:javascript
复制
DELETE test/_doc/1

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 7,
  "_primary_term" : 1
}

# "count" : 0, "deleted" : 2

由此,初步得出结论:更新、删除操作实际是在原来文档的基础上版本号 + 1,且每执行一次,版本号 +1 一次。同时,原来的老版本的文档标记为deleted 状态。

文档删除本质

删除文档本质:逻辑删除而非物理删除。在执行删除文档后,待删除文档不会立即将文档从磁盘中删除,而是将文档标记为已删除状态(版本号 _version + 1, "result" 标记为:"deleted",)。最直观的反应就是被经常问到的问题“怎么删除文档后,磁盘空间不降?”随着不断的索引更多的数据,Elasticsearch 将会在后台清理标记为已删除的文档。

如果想要从磁盘上删除,需要借助段合并来实现,具体实践参考:

代码语言:javascript
复制
POST test/_forcemerge?only_expunge_deletes

段合并中参数:“only_expunge_deletes“ 的含义只清除已标记为 deleted 的文档。

文档更新本质

更新文档的本质:delete + add。

代码语言:javascript
复制
In Lucene, the core engine of Elasticsearch, inserting or updating a document has thesame cost: in Lucene and Elasticsearch, to update means to replace.

表面上是更新,实际上是:Elasticsearch 将旧文档标记为已删除(deleted),并增加(add)一个全新的文档。同删除文档一样,旧文档不能被访问,但,旧文档不会被立即物理删除,除非手动或者定时执行了段合并操作。

索引删除本质

索引删除本质:物理删除数据。不同于删除文档,删除索引意味着删除其分片、映射和数据。索引删除会更直接、快速、暴力。删除索引后,与索引有关的所有数据将从直接从磁盘中删除。

索引删除包含两个步骤:

  • 更新集群
  • 分片从磁盘删除
代码语言:javascript
复制
删除索引操作:
DELETE test

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • Deleted 本质
    • 文档删除本质
      • 文档更新本质
        • 索引删除本质
        相关产品与服务
        Elasticsearch Service
        腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档