Elasticsearch 索引文档时create、index、update的区别【学习记录】

news2024/12/24 9:27:58

本文基于elasticsearch7.3.0版本。

一、思维导图

elasticsearch中create、index、update都可以实现插入功能,但是实现原理并不相同。

在这里插入图片描述

二、验证index和create

由上面思维导图可以清晰的看出create、index的大致区别,下面我们来验证下思维导图中的场景:

1、首先明确一点:如何指定是create操作还是index操作?可以通过在ES DSL指令后面拼接op_type=create_create实现。

例:假设目前我有一个索引为my_index,现在要向ES中索引一条doc,并指定是create操作:

POST my_index/_doc/1?op_type=create
{
  "tag":"指定id为1,并指定为create操作"
}
# 上面请求等价于
POST my_index/_doc/1/_create
{
  "tag":"指定id为1,并指定为create操作"
}

声明:文章后面内容中,所有演示的指令均省略了后面具体doc的内容,请知悉,如下图所示。
在这里插入图片描述


2、思考并验证:当向ES中索引一条doc,执行对应DSL指令时,ES底层默认触发什么操作?

场景1)向ES中索引一条数据,没有指定id,执行指令POST my_index/_doc时:

当您在指令中不提供文档ID时,Elasticsearch会自动生成一个唯一的文档ID,并使用该ID进行create操作。

场景2)向ES中索引一条数据,指定的id不存在,执行指令POST my_index/_doc/1(doc id为1的文档不存在)时:

当您在指令中指定的文档ID不存在时,则会使用指定的文档ID来执行create操作。

场景3)向ES中索引一条数据,指定了id并且id存在,执行指令POST my_index/_doc/1(doc id为1的文档存在)时:

当您在指令中指定的文档ID已经存在时,则会使用指定文档ID来执行index操作,更新该文档。这是因为index操作在存在相同文档ID时会执行更新操作(版本号在原有基础上+1),而不是创建新文档。

场景4.)向ES中索引一条数据,指定了id并且id存在,并指定了版本号,执行指令POST my_index/_doc/1?version=7&version_type=external时:

上述指令在Elasticsearch中,假设ID为1的文档已经存在,则会执行Elasticsearch的index操作。

在这个请求中,通过指定version参数为7和version_type参数为external,您告诉Elasticsearch在执行index操作时,将指定的版本号与文档的当前版本号进行比较。如果指定的版本号与当前版本号符合匹配规则,则会执行更新操作,否则会返回版本冲突错误。

补充:DSL中如何指定一个版本号?POST my_index/_doc/1?version=7&version_type=external_gte

  • version:外部指定版本号
  • version_type:外部版本号校验类型,有两种:external(默认,外部版本号必须要大于内部版本号),external_gte(外部版本号大于等于内部版本号)

注意:如果DSL指令如果指定了版本号,那么必须指定doc id,否则会报错。

3、下面我们演示思维导图中几种执行报错的场景:

场景1)执行create操作时,指定doc id并且id存在时,会报错。执行POST my_index/_doc/1?op_type=create指令,执行结果如下:[1] :版本冲突,文档已存在(当前版本[7])
在这里插入图片描述

场景2)执行create操作时,指定外部版本号时,会报错。那么执行POST my_index/_doc/1?op_type=create&version=8&version_type=external指令,执行结果如下:验证失败:1:创建操作仅支持内部版本控制。改为使用索引;
在这里插入图片描述

场景3)通过index更新数据时,指定的外部版本号没有超过当前版本号时,会报错。

先执行GET my_index/_doc/1指令,查看doc id为1的数据对应的version,可以看到id为1的doc,version为7。
在这里插入图片描述
当我们执行指令POST my_index/_doc/1?version=7&version_type=external时(指定了版本号没有指定op_type时,默认就是index操作),执行结果如下:[1] :版本冲突,当前版本[7]高于或等于提供的版本[7]
在这里插入图片描述

三、index和create小结

  1. 执行DSL指令,不指定文档id或指定文档id不存在时,系统会默认生成一个唯一的id,执行create操作,索引一个新文档;
  2. 执行DSL指令,指定了doc id并且存在时,默认执行index操作,会执行更新操作而不是索引新文档(如果此处显示的指定了create操作会报错);
  3. 执行DSL指令,指定了doc id并且存在时,默认执行index操作,如果此时又指定了外部版本号又显示指定操作类型为create,由于create操作只支持内部版本控制,会报错;
  4. 执行DSL指令,指定了doc id并且存在,同时又指定了外部版本号,此时指定的外部版本号必须大于或大于等于当前版本号,否则会执行错误。

四、update操作

在Elasticsearch的DSL指令中,可以使用以下方式来更新文档:

1、使用update指令:update指令用于更新指定文档的内容。更新可以是部分更新或完整替换,具体取决于您提供的更新内容。下面是一个示例:

其中,index_name是索引名称,doc_id是要更新的文档ID,field1是要更新的字段名称,new_value是要更新的字段值。

POST /index_name/_update/doc_id
{
  "doc": {
    "field1": "new_value"
  }
}

使用doc_as_upsert参数:如果要更新的文档doc_id不存在,您可以通过设置doc_as_upsert参数为true来执行全量覆盖操作。此时Elasticsearch会将doc参数中的内容作为新文档插入索引。下面是一个示例:

POST /index_name/_update/doc_id
{
  "doc": {
    "field1": "new_value"
  },
  "doc_as_upsert": true
}

2、使用update_by_query指令:update_by_query指令用于根据查询条件批量更新文档。您可以在查询条件中指定要更新的文档范围,然后提供要进行更新的内容。下面是一个示例:

POST /index_name/_update_by_query
{
  "query": {
    "match": {
      "field1": "value"
    }
  },
  "script": {
    "source": "ctx._source.field1 = 'new_value'"
  }
}

除了上述示例中的方式,还可以使用其他的更新方式,如通过script脚本来指定更新逻辑,或者使用upsert选项来指定如果文档不存在时要执行的操作。

请注意,具体的更新语法和选项可能会因Elasticsearch的版本而有所不同。建议参考官方文档或特定版本的API文档以获取准确的语法和选项。

五、index和update小结

1、在Elasticsearch中,如何选择使用index还是update进行doc更新?

  • index操作:使用index操作时,无论文档是否已存在,都会将提供的文档数据进行索引。如果指定的文档ID已存在,将会更新该文档的内容。这意味着index操作既可以用于创建新文档,也可以用于更新现有文档。

  • update操作:使用update操作时,可以对现有文档进行部分更新,而不是替换整个文档。通过update操作,您可以指定要应用的更新脚本或部分文档,以及如何更新现有文档的字段。这种方式更适合于需要对文档进行增量更新的情况。

因此,您可以根据具体的需求来选择使用index操作还是update操作。如果您希望完全替换文档或创建新文档,可以使用index操作。如果您只需要对文档的部分内容进行更新,可以选择update操作。

2、Elasticsearch的update和Lucene的update有哪些区别?

  • 粒度不同:Lucene的update操作是底层索引库的操作,它以文档为单位进行更新。而Elasticsearch的update操作是在更高级别的抽象上进行的,可以对文档的部分内容进行更新。

  • 更新方式不同:Lucene的update操作是通过先删除原始文档,再插入新文档来实现更新。而Elasticsearch的update操作可以通过使用更新脚本、部分文档或者提供的更新内容,对现有文档进行增量更新。

  • 并发处理不同:Lucene的update操作是在单个节点上执行的,不支持分布式并发更新。而Elasticsearch的update操作是分布式的,可以在多个节点上并发执行更新操作。

  • 功能扩展性不同:Elasticsearch的update操作提供了更丰富的功能和灵活性,如支持脚本更新、条件更新、局部更新等。而Lucene的update操作相对较为基础,功能较为有限。

总的来说,Lucene的update操作是底层索引库的原子操作,而Elasticsearch的update操作是在Lucene之上进行的更高级别的操作,提供了更多的功能和灵活性,适用于分布式环境下的文档更新需求。

3、ES 的DSL指令什么时候会使用Lucene的更新操作?

在Elasticsearch的DSL指令中,并不会直接使用Lucene的更新操作。Elasticsearch的DSL指令是在更高级别的抽象上操作的,当您使用Elasticsearch的DSL指令(如update、update_by_query等)来更新文档时,Elasticsearch解析DSL指令,并根据指令中提供的更新内容,在内部生成相应的Lucene更新操作。

虽然在DSL指令中没有直接使用Lucene的更新操作,但是Elasticsearch底层的引擎是基于Lucene的,它会利用Lucene的功能来实现文档的更新。

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

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

相关文章

2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题 理论技能与职业素养(100分) 2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题 【注意事项】 Geek极安云科专注技能竞赛技术提升,基于各大赛项提供全面的系统性…

大数据系列之:腾讯云服务器性能和价格比较

大数据系列之:腾讯云服务器性能和价格比较 一、磁盘性能和价格比较二、高性能云硬盘三、ssd云硬盘四、极速型ssd云硬盘五、增强型ssd云硬盘六、查看腾讯云服务器价格 一、磁盘性能和价格比较 磁盘名称高性能ssd云硬盘极速型ssd云硬盘增强型ssd云硬盘规格500g 5800 …

九州金榜|提高孩子认知,让问题自动消失

哈佛大学教授桑斯坦曾提出一个概念,叫做“信息茧房”。 意思是说:人们关注的信息领域,会习惯性地被自己的思想所引导,当你长时间接受单一观点时,就像蚕茧一样把自己越包越紧,越来越封闭。 走不出认知逻辑…

爬虫01-爬虫原理以及爬虫前期准备工作

文章目录 1 爬虫基本原理什么是爬虫爬虫功能详解爬虫基本流程两个概念:request和response 2 一些问题爬虫能抓取什么样的数据?抓取的数据怎么提取部分内容?数据解析方式。为什么我爬虫抓取的数据和浏览器看到的不一样怎样解决JavaScript渲染的…

数字档案安全与高效管理的先锋——亚信安慧AntDB数据库

档案工作在维护历史真实面貌、保障人民利益方面具有至关重要的作用。随着社会的发展,数字化转型成为档案管理领域的不可逆趋势。数字档案的存储和传输已经成为档案工作的重要组成部分,然而,这也伴随着一系列的挑战,其中安全风险是…

window11后台服务优化记录

这里:\WINDOWS\xxx\svchost.exe -k netsvcs -p 信号聚合器服务,用于根据时间、网络、地理位置、蓝牙和 CDF 因素评估信号。支持的功能包括设备解锁、动态锁定和动态 MDM 策略 参考: 优化参考v1

时间差异导致数据缺失,如何调整Grafana时间与Prometheus保持同步?

Grafana时间如何调快或调慢? 在k8s环境中,常使用prometheusgrafana做监控组件,prometheus负责采集、存储数据,grafana负责监控数据的可视化。 在实际的使用中,有时会遇到这样的问题,k8s集群中的时间比真实…

Zabbix6.4 监控系统 密码忘记怎么办

Zabbix6.4 监控系统 密码忘记怎么办? 如下图 本次主要介绍在Zabbix6.4中重置用户密码的步骤。 步骤 如果您忘记了Zabbix密码并且无法登录,请向Zabbix管理员求助。 超级管理员用户可以在用户配置表单中更改所有用户的密码。 如果超级用户忘记了密码&a…

C++指针小练习

双色球统计1-33个数字出现的次数(很详细) 做这个题一定要注意审题:题目要求是统计1-33个数字出现的次数,而不是前六个数字出现的次数 算法设计: ①:用一个数组p1来保存每一行的数据,再用一个数组p2来遍历1-33个数字,因为是要统计这33个数字出现的次数所以将数组初始化为0, ②…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑦

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷7 目录 需要竞赛软件包环境以及备赛资源可私信博主!!! 2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷7 模块一 …

建模软件Rhinoceros mac介绍说明

Rhinoceros mac是一款3D设计软件“犀牛”,在当今众多三维建模软件中,Rhinoceros 版因为其体积小、功能强大、对硬件要求低而广受欢迎,对于专业的3D设计人员来说它是一款不错的3D建模软件,Rhinoceros Mac中文版能轻易整合3DS MAX与…

关于对象存储的若干事

引言 最近在阅读鸣嵩的一篇文章,数据库的下一场革命:S3 延迟已降至原先的 10%,云数据库架构该进化了 收获很多,过去时间也基于对象存储做过一些功能实现,特记录下。关于鸣嵩: 曹伟,花名鸣嵩&am…

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用:发送网络请求,返回响应数据 安装:pip install requests requests模块发送简单的get请求、获取响应 需求:通过requests向百度首页发送请求,获取百度首页的…

2023 年度总结—总结我今年的AI之路-多项目实战经验谈AI发展前景

各位好,我是难忘,对人工智能方向有所研究,今年一年除了开发了几个软件项目之外的时间,基本都用到了学习研究AI上,最近几个月也是产出了几款AI领域的爆火文章,也把自己学习AI的笔记写了一个专栏,…

共融共生:智慧城市与智慧乡村的协调发展之路

随着科技的飞速发展和全球化的不断深入,智慧城市和智慧乡村作为现代社会发展的重要组成部分,正逐渐成为人们关注的焦点。然而,在追求经济发展的过程中,城乡发展不平衡的问题也日益凸显。因此,如何实现智慧城市与智慧乡…

FAST OS DOCKER 可视化Docker管理工具

介绍 FAST OS DOCKER 界面直观、简洁,非常适合新手使用,方便大家轻松上手 docker部署运行各类有趣的容器应用,同时 FAST OS DOCKER 为防止服务器负载过高,进行了底层性能优化;其以服务器安全为基础,对其进…

基于elementUI的el-table组件实现按住某一行数据上下滑动选中/选择或取消选中/选择鼠标经过的行

实现代码 <template><div :class"$options.name"><el-tablestyle"user-select: none"ref"table":data"tableData":row-class-name"row_class_name"mousedown.native"mousedownTable"row-click&q…

【微服务】日志搜集es+kibana+filebeat+redis+logstash(单机)

日志搜集系统搭建 基于7.17.16版本 ps: 项目是toB的&#xff0c;日志量不大 前置准备 软件下载 7.17.16版本。8.x版本需要JDK11 elastic.co/downloads/past-releasesJDK java8 Linux elastic 软件不能以root用户启动&#xff0c;需要创建用户 sudo useradd elastic #给此…

leaflet学习笔记-贝塞尔曲线绘制(八)

前言 两点之间的连线是很常见的&#xff0c;但是都是直直的一条线段&#xff0c;为了使连线更加平滑&#xff0c;我们可以使用曲线进行连线&#xff0c;本功能考虑使用贝塞尔曲线进行连线绘制&#xff0c;最后将线段的两端节点连接&#xff0c;返回一个polygon。 贝塞尔简介 …

【LangChain学习之旅】—(4) 模型I/O:输入提示、调用模型、解析输出

【LangChain学习之旅】—&#xff08;4&#xff09; 模型I/O&#xff1a;输入提示、调用模型、解析输出 Model I/OLangChain 中提示模板的构建语言模型为什么选择langchain输出解析总结 Reference&#xff1a;LangChain 实战课 Model I/O 我们可以把对模型的使用过程拆解成三块…