了解 Elasticsearch 自动生成的文档 _id:重复是一个问题吗?

news2024/11/19 20:23:47

Elasticsearch 中自动生成的文档 ID

当你在未指定 ID 的情况下对文档建立索引时,Elasticsearch 会自动为该文档生成唯一的 ID。 该 ID 是 Base64 编码的 UUID,由多个部分组成,每个部分都有特定的用途。

ID 生成过程针对索引速度和存储效率进行了优化。 负责此过程的代码可以在 GitHub 上的 Elasticsearch 的 TimeBasedUUIDGenerator 类中找到。

ID 是如何生成的?

ID 的前两个字节源自序列 ID (sequence ID),该 ID 会针对每个索引的文档而递增。 使用序列 ID 的第一和第三字节。 这些字节经常更改,这有助于提高索引速度,因为它使 ID 可以快速排序。

接下来的四个字节来自当前时间戳。 这些字节更改的频率较低,这有助于提高存储效率,因为它可以很好地压缩 ID。 时间戳被移动不同的量来生成这四个字节,这意味着它们以不同的速率变化。

接下来的六个字节是运行 Elasticsearch 的机器的 MAC 地址。 这有助于确保不同机器上 ID 的唯一性。

最后三个字节是时间戳和序列 ID 的剩余字节。 这些字节可能根本没有被压缩。

然后对生成的字节数组进行 Base64 编码以创建最终 ID。 Base64 编码是 URL 安全的,并且不包含填充,这使得 ID 在 URL 中使用安全且存储高效。

碰撞概率

Elasticsearch 为文档生成重复 ID 的概率极低,几乎可以忽略不计。 这是因为 Elasticsearch 使用 UUID(通用唯一标识符)来自动生成 ID。 UUID 是 128 位值,并且被设计为足够随机,因此冲突的概率(即多次生成相同的 UUID)很低。

自动生成的 ID 示例

让我们考虑一个自动生成的 ID 示例:“5PMM3nYBgTGA2v2S6qve”。 此 ID 是 Base64 编码的 UUID。 前两个字节来自序列 ID,接下来的四个字节来自当前时间戳,接下来的六个字节是运行 Elasticsearch 的机器的 MAC 地址,最后三个字节是时间戳的剩余字节和序列 ID。

问答

问:自动生成的 ID 在集群中的所有索引中是否唯一?

答:虽然自动生成的 ID 在索引内是唯一的,但它们在集群中的所有索引中并不是全局唯一的。 如果两个文档在两个不同的索引中具有相同的自动生成 ID,则它们将被视为两个不同的文档。

问:自动生成的 ID 发生冲突的概率是多少?

答:Elasticsearch 为文档生成重复 ID 的概率极低,几乎可以忽略不计。 这是因为 Elasticsearch 使用 UUID 来自动生成 ID,这些 ID 被设计得足够随机,因此冲突的概率极低。

让你了解一下有多低:为了以 50% 的概率发生至少一次碰撞,需要生成的随机版本 4 UUID(这是 Elasticsearch 使用的 UUID 类型)的数量为 2.71 quintillion (2.71 x 1⁰1⁸)。 这个数字是如此之大,即使每秒生成 10 亿个 UUID,生成这么多 UUID 也需要超过 85 年的时间。

问:我们可以不使用自动生成 ID 吗?

答:是可以的。在我们的很多代码中,我们可以这么来生成一个文档:

如上所示,我们可以在写入的时候指定文档的 id。这样做的缺点是:在每次写入的时候,Elasticsearch 需要检查当前的文档是否已经存在。如果该 id 的文档不存在,那么就会生成一个新的文档;如果已经存在,那么就会更新当前文档,比如,在上面的例子中,我们再次执行:

可见,在写入的过程中增加了一个查找文档的过程。显然对于大批量的文档写入来说,这个是非常不利的。

结论

Elasticsearch 的 ID 生成方法是索引速度、存储效率和查找速度之间的权衡。 它针对仅附加工作负载进行了优化,其中文档不断添加到索引中并且很少更新或删除。

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

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

相关文章

互联网Java工程师面试题·Java 总结篇·第九弹

目录 75、阐述 JDBC 操作数据库的步骤。 76、Statement 和 PreparedStatement 有什么区别?哪个性 能更好? 77、使用 JDBC 操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能? 78、在进行数据库编程时&a…

git 查看本地秘钥

第一步: 1,打开终端或者命令行窗口,输入一下命令: cd ~/.ssh进入ssh目录 2,查看该目录下的所有文件,输入以下命令: ls -al该命令将显示ssh目录下的所有文件,包括秘钥文件和配置文件,如果不存…

100天掌握网络安全知识点!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

C++ Primer 第十一章 关联容器 重点解读

1 map自定义排序 #include <map> #include <iostream> #include <functional> using namespace std; int main() {function<bool(pair<int, int>, pair<int, int>)> cmp [&](pair<int, int> p1, pair<int, int> p2) -&g…

设计模式-综合应用(一)

介绍 使用jQuery做一个模拟购物车的示例 用到的设计模式 工厂模式 单例模式装饰器模式 观察者模式状态模式 模板方法模式 代理模式 UML类图

leetcode - 319. Bulb Switcher

Description There are n bulbs that are initially off. You first turn on all the bulbs, then you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggl…

Apollo的搭建

Apollo的搭建 1.环境准备 jdk : 1.8 mysql 5.6.5 2.下载 两种方式&#xff1a; a.下载源码自己编译&#xff08;需要修改源码的可以选择&#xff09; 源码&#xff1a;https://github.com/ctripcorp/apoll b.编译好的直接使用 地址&#xff1a;Releases apol…

人人开源前后端分离开源项目启动流程(超详细)

renren-security是一个轻量级的&#xff0c;前后端分离的Java快速开发平台&#xff0c;能快速开发项目并交付【接私活利器】采用SpringBoot、Shiro、MyBatis-Plus、Vue3、TypeScript、Element Plus、Vue Router、Pinia、Axios、Vite框架&#xff0c;开发的一套权限系统&#xf…

Vue2基础知识(一) 认识Vue

&#x1f48c; 所属专栏&#xff1a;【Vue2】&#x1f600; 作 者&#xff1a;长安不及十里&#x1f4bb;工作&#xff1a;目前从事电力行业开发&#x1f308;目标&#xff1a;全栈开发&#x1f680; 个人简介&#xff1a;一个正在努力学技术的Java工程师&#xff0c;专注基础和…

原创!—混合灰狼层次结构的自适应麻雀搜索算法GWHASSA

麻雀搜索算法&#xff08;SSA&#xff09;是薛建凯等人[1]提出的一种群体智能优化算法,是受麻雀觅食和躲避捕食者行为启发而设计出的算法。该算法于2020年首次提出&#xff0c;具有局部搜索能力强、调整参数少等特点&#xff0c;已成功应用于CT图像的现场检测、电池堆参数的优化…

分布式和微服务

问题分析&#xff1a; 简单来说&#xff0c;分布式是一组通过网络进行通信&#xff0c;并且为了完成共同的计算任务的计算机节点组 成的系统。 分布式系统的设计理念&#xff0c;其实是来自于小型机或者大型机的计算能力的瓶颈和成本的 增加。 在集中式系统里面&#xff0c;要…

FL Studio21最新中文破解进阶高级完整版安装下载教程

目前水果软件最版本是FL Studio21&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;如…

ThreadLocal源码解密

1 背景 作为一只懒懒地程序员,其实我是不太爱看源码的,晦涩、深奥、难懂、耗费时间等等,就觉得不是我这种能力平平地小老百姓能吃得消的,但现实比人强,记得曾经我就被不懂原理的情况下乱用ThreadLocal给毒打了。 犹记得当时在一个JSF服务中的责任链的校验场景中需要在源…

使用vcpkg管理依赖第三库

文章目录 使用vcpkg管理依赖第三库vcpkg安装vcpkg经典模式使用从仓库列表搜索依赖项从某个基线版本的列表中查询某个依赖项信息安装依赖库 vcpkg清单模式的使用vcpkg清单模式的使用例子说明 使用vcpkg管理依赖第三库 vcpkg 有两种操作模式&#xff1a;经典模式和清单模式。 在…

36 机器学习(四):异常值检测|线性回归|逻辑回归|聚类算法|集成学习

文章目录 异常值检测箱线图z-score 保存模型 与 使用模型回归的性能评估线性回归正规方程的线性回归梯度下降的线性回归原理介绍L1 和 L2 正则化的介绍api介绍------LinearRegressionapi介绍------SGDRegressor 岭回归 和 Lasso 回归 逻辑回归基本使用原理介绍正向原理介绍损失…

深入理解JavaScript ES8的新特性

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

opencv改善pdf清晰度

improve-pdf 介绍&#xff1a; 使用python脚本对pdf进行优化&#xff0c;提高pdf清晰度&#xff0c;使文字更加清晰&#xff0c;观感更佳。仅适用黑白扫描版pdf&#xff0c;且文字较清晰&#xff0c;若模糊会更加模糊。 原理&#xff1a; pdf转成png图片 再使用opencv对图片…

【算法训练-回溯算法 三】【回溯算法最佳实践】括号生成、复原IP地址

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【回溯算法】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

由Django-Session配置引发的反序列化安全问题

漏洞成因 漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE&#xff1a; 在Django中&#xff0c;SESSION_ENGINE 是一个设置项&#xff0c;用于指定用于存储和处理会话&#xff08;session&#xff09;数据的引擎。 SESSION_ENGINE 设置项允许您选择不…

MSQL系列(六) Mysql实战-SQL语句优化

Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则&#xff0c;Explain的用法&#xff0c;可以看到是否使用了索引&#xff0c;今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…