文章十二:索引数据的写入和删除

Elasticsearch 数据写入核心流程

  1. 路由分片 :根据文档 ID(或自定义 routing)计算归属的主分片,确定数据要写入的分片位置;
  2. 请求转发:接收请求的协调节点,将写入请求转发到主分片所在的节点;
  3. 主分片写入
    • 先写Translog(事务日志,追加写入磁盘,保证数据不丢失);
    • 再写内存缓存(Memory Buffer),此时数据暂不可查询;
  4. 副本同步:主分片将写入请求同步到所有副本分片,副本分片重复「写 Translog + 内存缓存」操作,全部同步成功后反馈给主分片;
  5. 返回响应:主分片向协调节点返回成功,协调节点最终告知客户端写入完成;
  6. 刷新(Refresh) :默认 1 秒一次,将内存缓存中的数据生成不可变的 Segment(倒排索引段) 写入文件系统缓存,数据从此可被查询;
  7. 刷盘(Flush) :当 Translog 达到阈值 / 超时(默认 512MB/30 分钟),触发 Flush:
    • 执行 Refresh 清空剩余内存缓存;
    • 将所有 Segment 从文件系统缓存刷到磁盘(持久化);
    • 清空 Translog;
  8. 合并(Merge):后台异步合并多个小 Segment 为大 Segment,优化查询性能,合并后删除原小 Segment。

索引数据的写入方式:

单条写入:

复制代码
PUT <index_name>/_doc/<doc_id>
{
  <json源数据>
}

同时我们也可以使用_create API,如果数据存在,就会创建失败,如果不存在就会创建.

复制代码
PUT <index_name>/_create/<doc_id>
{
  "json格式source数据"
}

也可以使用post进行写入,并且使用post进行插入的时候,是可以不用指定id的

如果不指定id,就是直接进行插入操作

复制代码
POST<index_name>/_doc
{
  <json源数据>
}

也可以指定id,这个就和PUT的操作是一样的了

复制代码
POST <index_name>/_doc/<doc_id>
{
  <json源数据>
}

插入数据的一些参数:

refresh:时候再插入数据时,立即执行refresh操作,默认是1S,不执行refresh操作的话不可以立即查询的到

routing:执行数据具体写入到哪个分片中

wait_for_active_shards:等到多少个副本分片同步之后,向用户反馈执行结果

Elasticsearch 中 version + version_type 组合说明表

表格

组合使用方式 核心逻辑 适用场景 示例(HTTP 请求)
version=N + internal ES 内置版本号,仅当文档当前版本等于 N 时执行操作(N 为正整数,ES 自增) 普通并发控制,避免脏写(默认组合) PUT /my_index/_doc/1?version=5&version_type=internal(仅版本 5 时更新)
version=N + external 自定义版本号,仅当指定版本 N 大于 文档当前版本时执行(N 可为时间戳 / 业务号) 业务自定义版本,严格控制 "新版本覆盖旧版本" PUT /my_index/_doc/1?version=1711234567890&version_type=external(时间戳版本)
version=N + external_gte 自定义版本号,仅当指定版本 N 大于等于 文档当前版本时执行 重试场景,允许相同版本重复执行操作 PUT /my_index/_doc/1?version=1711234567890&version_type=external_gte(允许同版本更新)
  1. version版本号数值version_type版本校验规则,两者必须配合使用才生效;
  2. 若仅传 version 不传 version_type,ES 会默认使用 internal 规则;
  3. 新增文档(文档不存在)时:
    • internal 规则下 version 无效(ES 自动初始化为 1);
    • external/external_gte 规则下,version 会被设为文档初始版本号。

批量写

使用_bulk API进行批量的写入。

复制代码
POST _bulk
{"index":{"_index":"index_test","_id":1}}
{"name":"lihua","age":11,"class":"class01"}
{"index":{"_index":"index_test"}}
{"name":"lihua","age":11,"class":"class02"}

LogStash工具进行数据写入

敬请期待

数据的删除

这里需要注意的是es使用的是标记删除,等到下次写入到磁盘的时才会真正的删除

批量删除

通过bulk API进行删除

复制代码
POST _bulk
{"delete":{"_index":"index_test","_id":"1"}}

条件删除

wait_for_completion 参数核心含义

wait_for_completion 是 Elasticsearch 中用于控制长耗时操作是否同步等待完成 的布尔型参数,常见于 _reindex_snapshot_restoredelete_by_query 等 API 中。


✅ 两种取值与行为

表格

取值 含义 适用场景
true(默认) 请求会阻塞客户端,一直等到操作完全完成后才返回结果。 操作耗时较短、需要立即获取最终结果的场景。
false 请求会立即返回,同时生成一个后台任务 ID,操作在集群后台异步执行。 操作耗时很长(如大批量重索引、快照备份),避免客户端长时间挂起超时。

我们在进行大批量的条件删除,通过参数设置

对于条件删除使用的API是:

复制代码
POST index_test/_delete_by_query?wait_for_completion=false
{
  "track_total_hits":true,
  "query":{
    "match":{
      "name":"lihua"
    }
  }
}

查询条件删除的结果,这种异步删除的方式是比较推荐的
GET _tasks/XvLWaMoHSNKblvuPicgA0A:116667
相关推荐
代码探秘者2 小时前
【算法篇】5.链表
java·数据结构·人工智能·python·算法·spring·链表
1104.北光c°2 小时前
Leetcode3.无重复字符的最长子串 HashSet+HashMap 【hot100算法个人笔记】【java写法】
java·开发语言·笔记·程序人生·算法·leetcode·滑动窗口
Binary-Jeff2 小时前
Maven 依赖作用域详解:compile、provided、runtime、test
java·spring·spring cloud·servlet·java-ee·maven
QH_ShareHub2 小时前
Rstudio 与 R 打开 Rdata (压缩文件) 差异
java·前端·r语言
spencer_tseng2 小时前
apache-maven-3.9.6
java·maven
yashuk2 小时前
springboot与springcloud对应版本
java·spring boot·spring cloud
Elastic 中国社区官方博客2 小时前
Elasticsearch:shell 工具不是上下文工程的银弹
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
strayCat232552 小时前
4. Spring Boot 数据持久化(JPA)
java·spring boot·后端
无风听海2 小时前
LangGraph Thread 数据清理总结
java·开发语言·jvm·langchain·deep agents