Elasticsearch使用篇 - 更新文档

news2024/11/15 19:28:57

更新的内部机制

在这里插入图片描述

注意:实际使用 murmurhash 算法

在这里插入图片描述

注意:更新任何一个字段都是全部删除。并发更新操作之间无事务隔离保证,会产生数据错位问题。

更新操作

1、单条覆盖更新

1、覆盖式更新,由客户端完成所有数据的组装,服务端认可数据的完整性,执行覆盖。

2、数据更新一次,内部会先删除,再插入。

3、数据总条数增加,直到下一次物理文件合并才会恢复正常统计。

PUT demo-000001
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "refresh_interval": "30s"
  }
}

number_of_shards:指定索引对应的主分片的个数。默认 1。该参数只能在创建索引时指定。每个索引最多有 1024 个分片。可以通过指定 export ES_JAVA_OPTS="-Des.index.max_number_of_shards=128" 系统变量来修改该限制。

number_of_replicas:指定每个主分片对应的副本分片的个数。默认 1。

refresh_interval:控制刷新的时间间隔。刷新可以使索引的最近变化对于搜索可见,默认 1s。可以设置为 -1,表示禁止刷新。

更多索引参数可以参考 Elasticsearch官方的索引参数介绍


插入 id 为 1 的文档

PUT demo-000001/_doc/1
{
 "name": "tom"
}

紧接着在 30 秒之内进行搜索,却发现没有搜索结果

GET demo-000001/_search

然后执行刷新操作

POST demo-000001/_refresh

接着进行搜索,却发现有了搜索结果

GET demo-000001/_search

接着插入 id 为 1 的文档,但是文档内容不同。

PUT demo-000001/_doc/1
{
  "content": "hello world"
}

接着进行搜索,却发现原来 id 为 1 的文档的内容被覆盖了。

2、单条局部更新

1、局部更新本质也是覆盖式更新,只是由服务端完成数据的合并。

2、支持 upsert 与 script 更新。

3、一定要使用 POST,而不能使用 PUT。

接着对 id 为 1 的文档执行局部更新操作,增加一个 “title” 字段。

POST demo-000001/_update/1
{
  "doc": {
    "title": "how to do it"
  }
}

接着进行搜索,发现文档原来的 “content” 字段保留了下来,此时文档中有 “title”、“content” 两个字段。

GET demo-000001/_search

测试一下,如果先删除 id 为 1 的文档,再执行局部更新操作。

DELETE demo-000001/_doc/1

同样地,执行局部更新操作,却出现 “document_missing_exception” 异常

POST demo-000001/_update/1
{
  "doc": {
    "title": "how to do it"
  }
}

对此需要加 doc_as_upsert,如果指定文档不存在就进行插入。

POST demo-000001/_update/1
{
  "doc": {
    "title": "how to do it"
  },
  "doc_as_upsert": true
}

再来试一下脚本方式的局部更新。

首先插入一条 id 为 2 的文档。

PUT demo-000001/_doc/2
{
  "content": "hi world",
  "income": 100
}

接着对这条 id 为 2 的文档执行脚本局部更新。

POST demo-000001/_update/2
{
  "script": {
    "source": """
      ctx._source.income += 200
    """
  }
}

搜索发现,id 为 2 的文档的 income 的值变为了 300,并且 content 字段也保留了下来。

GET demo-000001/_search

再试一下使用脚本删除字段。

POST demo-000001/_update/2
{
  "script": {
    "source": """
      if (ctx._source.containsKey('content')) {
        ctx._source.remove('content')
      }
    """
  }
}

如果使用脚本方式进行更新,但是指定 id 的文档事先不存在,就需要使用 upsert、scripted_upsert 参数分别指定指定参数的默认值、如果脚本方式操作的文档不存在时是否进行插入。

POST demo-000001/_update/3
{
  "script": {
    "source": """
      ctx._source.income += params.p1
    """,
    "params": {
      "p1":  100
    }
  },
  "upsert": {
    "income": 100
  },
  "scripted_upsert": true
}

3、批量更新

1、海量数据更新优先选择 bulk。

2、支持插入式更新。

3、单条更新实际内部也是 bulk 执行。

4、实际是局部更新。

POST _bulk
{"update":{"_id":"1","_index":"book"}}
{"doc":{"content":"hello world","title":"this is title"},"doc_as_upsert":true}
{"update":{"_id":"1","_index":"book"}}
{"doc":{"content":"hi world"}}

4、条件更新

1、内部实现基于快照查询机制。

2、内部异步完成。

首先创建 kibana_sample_data_logs_update 索引

POST _reindex
{
  "source": {
    "index": "kibana_sample_data_logs"
  },
  "dest": {
    "index": "kibana_sample_data_logs_update"
  }
}

接着执行条件更新

POST kibana_sample_data_logs_update/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": """
    ctx._source.host = 'www.baidu.com'
  """
}

并发冲突

因为 Elasticsearch 不支持严格的 ACID 事务特性,并且更新过程包括:"查询-标记删除-插入"三个操作。

查询时添加 version 请求参数,并且设置为 true,可以在响应体中返回 version 版本号。

GET demo-000001/_search?version=true

更新文档时,可以使用 version_type 请求参数指定一个外部版本号。

PUT demo-000001/_doc/4?version=11&version_type=external
{
  "title": "this is forth document"
}

如果 version_type 请求参数为 external,则下一次更新时就需要指定大于文档当前的版本号才会成功执行。

PUT demo-000001/_doc/4?version=20&version_type=external
{
  "title": "this is forth document"
}

如果 version_type 请求参数为 external_gte,则下一次更新时就需要指定大于等于文档当前的版本号才会成功执行。

PUT demo-000001/_doc/4?version=20&version_type=external_gte
{
  "title": "this is my forth document"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35. 实战:Python实现视频去水印(文末源码)

目录 前言 目的 思路 代码实现 1. 请求URL,查看源代码 2. 源代码中没有就去抓包工具 3. 拿到视频源链接,继续检索来源 4. 拿到数据和链接,二进制写入到本地 完整源码 运行效果 总结 前言 我们在刷某短视频平台时,有些…

SpringCloud搭建微服务之Vault密钥管理

1. 概述 Vault是一款管理密钥和保护敏感数据的组件,用于保护、存储和严格控制对令牌、密码、证书和加密密钥的访问,可以使用UI客户端、CLI和HTTP API访问密钥和其他敏感数据。更多详细介绍,可以参阅vault官网 2. Vault下载与安装 本文以wi…

【Python学习笔记】6. Python3 基本数据类型(下)——列表、元组、集合、字典、数据类型转换

前言 本文介绍Python3基本数据类型——列表、元组、集合、字典、数据类型转换。 List(列表) List(列表) 是 Python 中使用最频繁的数据类型。 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0…

MySQL存储结构

数据结构 数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/ 树 二叉树缺点: 单边节点过多时无法提高效率 红黑树: 具有平衡功能的二叉树,解决了单边节点过多导致的效率无法提高的问题,缺点是平衡算法…

移动端 自适应布局方案

文章目录DPRrem布局实现机理优点缺点相关技术方案viewport 布局优点缺点相关技术方案媒体查询等比缩放原理DPR DPR 设备物理像素 / CSS像素 DPR 2 为例,把 4(2x2)个物理像素当一个 CSS 像素使用 rem布局 rem 就是相对于根元素 html 的…

【正点原子FPGA连载】第二十章Linux图形化配置及其原理 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十章Linux图…

Python获取信用企业的数据

文章目录前言一、需求二、分析三、测试运行前言 本系列文章来源于真实的需求本系列文章仅供学习参考本系列文章你来提我来做 one:Leave a message at the end of the article two:Get wechat contact information 一、需求 需求 URL:https://szxt.zjamr.zj.gov.cn…

如何保持线上安全:你们的个人网络安全指南

在互联网上保持安全的最佳做法。 我们之前写过关于保护你们的加密资产的文章——你们可以在此处查看我们的加密操作安全指南。现在是时候准备一组更通用的提示来帮助你们保持线上安全。我们知道你们可能大部分的购物都是在网上进行的,我们真的不希望你们被黑客攻击。…

HTB_Funnel_ssh隧道转发

文章目录信息收集hydra ssh 暴破ssh 隧道转发 postgresql 流量postgresql 使用动态端口转发信息收集 nmap -sC -sV 10.129.143.249 账号密码 Anonymous:ftp 发现两个文件,下载 默认密码 funnel123#!# 一封邮件 邮箱名可能是用户名 hydra ssh 暴破 hydra -L userna…

Redis_主从复制

一、介绍主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。二、作用读写分离,性能拓展容灾快速恢复(一主多从)三、搭建配置1、创建/myredis文件夹2、复制Re…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (二)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

【GPLT 二阶题目集】L2-041 插松枝

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的: --->每人手边有一只小盒子,初始状态为空。 --->每人面前有用不完的松枝干和一个推送器&#xf…

[NSSRound#7 Team]Web学习

系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录一、ecRCE二、Shadowflag三、[NSSRound#7 Team]新的博客四、[NSSRound#7 Team]0o0提示:以下是本篇文章正文内容,下…

【异常】发送失败,此请求可能存在风险,已被微信拦截

一、背景说明 今天上线了新年红包的功能,但是部分用户提示了如下的异常,没有明显的异常提示,就是在查询ELK时,看了如下的错误提示,错误截图如图 提示“发送失败,此请求可能存在风险,已被微信拦…

【Redis】hmdp点赞、排行榜、分页功能的实现

【Redis】hmdp点赞、排行榜、分页功能的实现 文章目录【Redis】hmdp点赞、排行榜、分页功能的实现1.点赞功能实现1.1 需求1.2 实现步骤1.3 思路分析1.4 代码实现1.5 逻辑解析2. 排行榜功能实现2.1 需求2.2 实现步骤2.3 思路分析2.4 代码实现2.5 逻辑解析3. 分页功能实现3.1 需求…

算法之美~贪心算法

如何理解贪心算法?假设有一个可以容纳100kg物品的背包,可以装各种物品。有以下5种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,如何选择在背包中装哪些豆子?每种豆子又该装多少呢&#…

Pikachu靶场攻略(代码分析)

2023年将会持续于B站、CSDN等各大平台更新,可加入粉丝群与博主交流:838681355,为了老板大G共同努力。 一、安装 Phpstudy_pro设置数据库用户名密码 root 123456 更改\pikachu\inc\config.inc.php 访问pikachu页面点击配置即可。 二、 攻略(包含审计…

BiQuadDesigner相关算法研究

一、获取相关源码方法如下 1、打开BiQuadDesigner相关网页如下 2、菜单:更多工具->开发者工具 3、在此重点研究BiQuadDesigner,选择BiQuadDesigner下的javascript,分别查看BiQuad.js和BiQuadFilter.js 二、研究频响曲线生成步骤如下 1、参数输入及换算滤波器系数如下参…

【数据结构基础】线性表 - 栈和队列

知识点栈 - LIFO示意图实现使用数组实现的叫静态栈使用链表实现的叫动态栈队列 - FIFO示意图实现使用数组实现的叫静态队列使用链表实现的叫动态队列栈和队列相关题目用栈实现队列232. Implement Queue using Stacks (Easy)栈的顺序为后进先出,而队列的顺序为先进先…

【前端设计】复位保护模块的整体设计思路

前言 复位保护模块,是在单系统进行动态复位的过程中,对接口进行硬性逻辑保护,避免异步复位过程中的毛刺对周围系统产生影响的模块。一般而言,简单的单系统动态复位流程可以归纳为: 停止业务功能,收齐接口上的rsp,进入待复位状态;使能复位保护,通过逻辑避免毛刺和误触…