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

本文基于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.rhkb.cn/news/236188.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列二、Spring Security中的核心类

一、Spring Security中的核心类 1.1、自动配置类 UserDetailsServiceAutoConfiguration 1.2、密码加密器 1.2.1、概述 Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数&a…

数据结构与算法:堆

数据结构与算法:堆 堆堆的定义堆的实现结构分析初始化向上调整算法向下调整算法堆的插入堆的删除得到堆顶元素判断堆是否为空 堆的应用TopK问题 堆 堆的定义 定义: 堆是一种数据结构,本质上是一个特殊的树结构,它是一个完全二叉…

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML? QML是一种用户界面规范和编程语言。它允许开发人员…

Invalid bound statement(只有调用IService接口这一层会报错的)

问题描述:controller直接调用实现类可以,但是一旦调用IService这个接口这一层就报错. 找遍了大家都说是xml没对应好,但是我确实都可以一路往下跳,真的对应好了.结果发现是 MapperScan写错了,如下才是对的. MapperScan的作用是不需要在mapper上一直写注解了,只要启动类上写好就放…

python 计数器

这个Python脚本定义了一个名为new_counter()的函数,它读取系统时间并将其与存储在文件中的时间进行比较。然后根据比较结果更新存储在另一个文件中的计数器值。如果系统时间与存储的时间匹配,则计数器值增加1。如果系统时间与存储的时间不匹配&#xff0…

C#实现Excel合并单元格数据导入数据集

目录 功能需求 Excel与DataSet的映射关系 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 ​方法设计 返回值 参数设计 打开数据源并计算Sheets 拆分合并的单元格 创建DataTable 将单元格数据写入DataTable 总结 功能需求 将Excel里的worksheet表格导入到Da…

MySQL连续案例续集

1、查询学过「张三」老师授课的同学的信息 分析:平均 avg:GROUP BY分组 从高到低:ORDER BY 所有学生的所有课程的成绩:行转列 所有学生----外联(所有):RIGHT JOIN右联 SELECTs.*,c.cname,t.tnam…

PPT自动化处理

python-pptx模块 可以创建、修改PPT(.pptx)文件非Python标准模块,需要单独安装 在线安装方式 pip install python-pptx 读取slide幻灯片 .slides 获取shape形状 slide.shapes 判断一个shape中是否存在文字 shape.has_text_frame 获取文字框 shape.text_f…

可以打印试卷的软件有哪些?推荐这几款

可以打印试卷的软件有哪些?随着科技的飞速发展,越来越多的学习工具如雨后春笋般涌现,其中,能够打印试卷的软件尤其受到广大学生和家长的青睐。这些软件不仅方便快捷,而且内容丰富,可以满足不同学科、不同年…

简单明了,汽车级LM317系列LM317D2TR4G线性电压稳压器电源设计-参数应用方案分享

低压差线性稳压器(LDO),是指一种具有恒定电流输出电压的装置,主要由输入变压器、整流器、输出变压器三部分构成,工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压,再经过控制元件和开关器件将稳…

协作共生:数字孪生与智慧城市的共赢之路

引言 随着科技的飞速发展,数字孪生和智慧城市的概念逐渐融入现代城市的规划和建设中。数字孪生技术为智慧城市的建设提供了强大的支持,而智慧城市则为数字孪生的应用提供了广阔的舞台。本文将深入探讨数字孪生与智慧城市之间的相互影响与协作&#xff0…

使用Nginx作为反向代理服务器在Linux中的最佳实践

在Linux环境下,Nginx因其高效性能、稳定性以及丰富的功能集而广泛用于作为反向代理服务器。以下是在Linux中使用Nginx作为反向代理服务器的最佳实践: 1. 安装与配置 首先,确保你的Linux发行版已经安装了Nginx。大多数Linux发行版都提供了Ng…

分布式系统架构设计之分布式缓存技术选型

一、概述 随着互联网业务的快速发展,分布式系统已经成为了解决大规模并发请求、高可用性、可扩展性等问题的重要手段。在分布式系统中,缓存作为提高系统性能的关键技术,能够显著降低数据库负载、减少网络延迟、提高数据访问速度。当面对大量…

【局域网window10系统搭建共享文件夹或与手机共享】

局域网window10系统搭建共享文件夹或与手机共享 1、Window 10之间搭建共享文件夹1.1 ping通两台window 10 电脑1.2 创建共享账号(window 10专业版)1.3 创建共享文件夹以及配置1.4访问共享文件夹 2、手机访问window10 共享文件夹(结合步骤一&a…

Python 网络数据采集(四):Selenium 自动化

Python 网络数据采集(四):Selenium 自动化 前言一、背景知识Selenium 4Selenium WebDriver 二、Selenium WebDriver 的安装与配置2.1 下载 Chrome 浏览器的驱动程序2.2 配置环境变量三、Python 安装 Selenium四、页面元素定位4.1 选择浏览器开…

基于JAVA的数据可视化的智慧河南大屏 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏,包含了GDP、…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺,4*A53架构,Android 9.0操作系统,搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力,专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

如何实现IOS APP被杀掉后依然可以接收到个推消息通知

背景 项目已经集成了个推SDK,但是在离线场景下无法收到推送消息,离线场景主要分2种情况,一种是用户将APP切换到了后台,一种是用户将APP杀掉了。 针对场景一:我们可以将APP支持后台运行,比如项目中使用到了…

【STM32单片机】步进电机控制系统设计

文章目录 一、主要功能二、软件设计三、实验现象联系作者 一、主要功能 本项目使用STM32F103C8T6单片机控制器,使用ULN2003电机模块、IIC OLED模块、按键模块等。 主要功能: 系统运行后,OLED显示电机当前运行档位、方向、状态。 可通过按键…

【Python从入门到进阶】46、58同城Scrapy项目案例介绍

接上篇《45、Scrapy框架核心组件介绍》 上一篇我们学习了Scrapy框架的核心组件的使用。本篇我们进入实战第一篇,以58同城的Scrapy项目案例,结合实际再次巩固一下项目结构以及代码逻辑的用法。 一、案例网站介绍 58同城是一个生活服务类平台&#xff0c…