ES partial update(部分更新文档的使用)

1 什么是partial update

1.1 全量修改文档的原理

全量修改文档的语法: PUT index/type/1, 如果id=1的文档不存在, 则创建, 如果存在, 将发生替换原有文档的操作

PUT test/_doc/1
{
    "counter" : 1,     //有2个属性,counter和tags
    "tags" : ["red"]
}

PUT test/_doc/1
{
    "counter" : 2     //尝试覆盖
}

查询此时document结果结果:

GET test/_doc/1
{
    "_index": "test",
    "_type": "_doc",
    "_id": "1",
    "_version": 2,
    "_seq_no": 1,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "counter": 2     //此时只有counter属性
    }
}

全量替换文档的性能比较低, 为了避免替换操作的发生, 引入partial update: 只修改指定的field, 不用全量修改数据.

1.2 修改指定field的思路

(1) 根据用户请求, 获得要修改的文档;

(2) 在内存中封装用户提交的新文档, 发送PUT请求到ES内部;

(3) 将要替换的旧文档标记为deleted;

(4) 最后将封装好的新文档存入索引中.

1.3 partial update的优势

(1) 所有的查询、修改和写回操作, 都在同一个shard中进行, 避免了网络传输的开销.

不需要: 从特定shard查询文档 -> 返回到内存 -> 内存中修改 -> 将修改的文档发送到原来的shard -> 写索引 —— 这个复杂的操作, 显著提升了性能.

(2) 减少了查询和修改的时间间隔, 可以有效减少并发冲突.

1.4 partial update的使用

我们复用官网的格式:

POST test/_doc/1/_update
{
    "doc" : {                  //doc声明
        "name" : "new_name"   //需要修改的字段,该字段可以存在,也可以不存在
                               //如果字段已存在,则修改这个字段;如果不存在,则新增这个字段
    }
}

实战:

// 添加测试数据: 
PUT employee/developer/1
{
    "name": "shou feng", 
    "sex": "male",
    "age": 20
}

// partial update修改指定field: 
POST employee/developer/1/_update
{
    "doc": {
        "age": 21
    }
}

// 响应结果: 
{
    "_index": "employee",
    "_type": "developer",
    "_id": "1",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    }
}

// 查看文档, 发现age已经从20变为21了. 并且其他的字段都还存在,没有被覆盖
GET employee/developer/1


注意:url中一定是 _update 结尾的,否则即使body体加了doc,此时会把doc体当做普通的参数,导致覆盖行为

partial 与 upsert组合使用

参见 Update API》doc_as_upsert章节

参考 https://www.cnblogs.com/shoufeng/p/11348277.html

### 使用 Elasticsearch-head 插件修改 Elasticsearch 中的数据 Elasticsearch-head 是一个用于管理 Elasticsearch 集群的 Web 前端工具,它允许用户通过浏览器界面查看集群状态、索引结构以及文档内容。虽然它的主要功能是提供可视化管理和查询能力,但它也支持对现有数据进行更新操作。 #### 1. 连接至 Elasticsearch 实例 启动 `elasticsearch-head` 后,在浏览器中访问其页面并连接到目标 Elasticsearch 节点或集群。确保输入正确的主机名和端口号(默认为 `http://localhost:9200/`)。这一步可以通过点击界面上方的 “Connect” 按钮完成[^1]。 #### 2. 浏览索引与文档 一旦成功建立连接,可以从左侧导航栏选择特定索引来浏览其中存储的文档列表。每条记录通常会显示 `_id`, `_type`, 和实际字段值等内容[^2]。 #### 3. 编辑单个文档 要修改某个具体文档的内容: - 在对应索引下找到该文档; - 点击右侧的操作按钮进入编辑模式; - 对所需更改的属性重新赋值; - 提交保存后即完成了对该文档部分更新请求 (Partial Update)[^3]。 注意:此过程实际上是发送了一次 HTTP PUT 请求给 Elasticsearch API 来实现数据变更的目的。 #### 4. 更新批量或多条目信息 对于更复杂的场景比如需要一次处理多份资料,则可能需要用到脚本或者直接调用 RESTful APIs 的方式来进行大规模改动。此时可以考虑编写自定义逻辑并通过 Kibana Dev Tools 或者 curl 工具手动触发相应命令[^4]。 以下是利用 JavaScript SDK 示例代码展示如何程序化地执行类似任务: ```javascript const { Client } = require('@elastic/elasticsearch'); async function run() { const client = new Client({ node: 'http://localhost:9200' }); await client.update({ index: 'your_index_name', id: 'document_id_to_update', body: { doc: { fieldToUpdate: newValue } } }); } run().catch(console.error); ``` 上述片段展示了怎样借助官方提供的 Node.js 库来异步安全地调整指定 ID 文档内的某些字段数值。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值