Elasticsearch如何动态维护一个不可变的倒排索引

news/2024/7/7 6:41:11 标签: elasticsearch
上一篇文章中介绍了Elasticsearch中是如何搜索文本的,同时也简述了在es里面索引数据结构的特点不可变性。


索引不可变性的缺点限制了单个索引存储的最大数据量以及更新的频次,所以es面临的问题是如何解决倒排索引不可更新的特点而同时仍然保持不可变特性带来的好处。


答案就是使用多个索引

代替原来的每次重写整个索引,es里面采用方式是增加新的索引来反映最近的变化,然后查询的时候一次查询所有的倒排索引,从最早的一直到最新的,然后在合并结果返回。

在lucene里面一个索引是多个segment加上一个commit point文件组成,每个segment都是一个倒排索引,而commit point这个文件标记了所有的已知的segment文件。如下图所示:


[img]http://dl2.iteye.com/upload/attachment/0129/1489/486c12c3-c8f0-3781-bc92-6b3a7caa77cb.png[/img]


注意lucene里面的index在es里面叫做shard,es里面的一个index可以包含多个shard,对es里面的一个索引查询在es底层会把查询请求发送到所有shard里面最后在把结果集合并并返回。


回到文章开头的问题,es如何利用多索引来解决更新的问题,下面我们看下数据被写入es的过程:


(1)当es收到一个写入或者更新的请求时,首先会把这个数据收集在内存的indexing buffer

(2)经过一定的间隔或者外部命令触发时,会在内存缓冲区生成新的segment。

(3)然后segment首先会被写到filesystem cache中,这个时候其实搜索就能搜到了。

(4)然后经过一段时间filesystem cache中的segment会被fsync到磁盘文件上并在commit point文件中记录新segment文件名称,同时新的segment会被打开确保搜索可见

(5)最终内存里面buffer区会被清空,并等待收集新的documnet。


如下图:

[img]http://dl2.iteye.com/upload/attachment/0129/1491/8201a127-9d97-3ae1-9aa7-cf6f84a39bf5.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0129/1493/85ad0abb-4c41-3ab3-b866-b46e5c2a8cd5.png[/img]



当收到查询请求时,所有的sengment包含内存和磁盘中的会被依次查询,最终聚合所有segment并准确计算每个document的相关性,上面的实现方式可以相对代价比较小的方法处理新增的document。


上面介绍的是新增数据的处理,接下来我们看下如果有删除和更新请求那么es是如何处理的。


首先我们知道sengments本身是不可变的,所以document是不能从旧的segments中移除,同时也不能被更新,那么es是如何处理删除和更新请求的呢?


在每次commit point时,es会生成一个后缀为.del的文件,这个文件标记了所有已经被删除的数据,在一条数据被删除时,es仅仅会在.del文件里面做个删除标记,被标记删除的数据仍然会被查询到,但是在最终返回结果之前,被标记删除的数据会被移除,这就是es里面删除的实现逻辑。


同理更新的逻辑也类似,当一个document被更新时,旧版本的document也会在.del文件里面被打上删除标记,新版本的document会被索引到一个新的segment里面,这个时候的查询会同时把两者都查询出来,但在最终返回结果之前被标记删除的旧版本数据会被移除掉。


以上就是es里面实现动态更新索引的内容,在这里我们能看到es里面更新和删除都类似于采用伪删除的策略来实现,到这里大家可能有个疑问,那些被标记删除的数据,什么时候才会被文件系统真正的清除,毕竟量大了还是对性能有一点影响的,这个在后面segment merge的文章中介绍。

[b][color=green][size=large] 有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。 [/size][/color][/b] [img]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg[/img]

http://www.niftyadmin.cn/n/787575.html

相关文章

移动电商——Flutter-Fluro的全局注入和使用方法

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

Android 通过Web服务器与Mysql数据库交互

之前一直没时间回复大家,抱歉,现在已经把Demo放在Github上面了。 欢迎star https://github.com/Tianweidadada/LoginDemoReposity 一、主要内容 以手机登录为例,实现与数据库交互。 分成两个项目:前端(android 简易界…

图像太宽无法输出请裁剪图像或降低分辨率然后重试_图像合成神器 MSG-GAN入选CVPR2020,超越最先进GAN,稳定多尺度高分辨率...

今天分享一篇被CVPR 2020接收的论文,这篇论文与生成对抗GAN相关,题目为“MSG-GAN: Multi-Scale Gradient GAN for Stable Image Synthesis”(MSG-GAN:用于稳定图像合成的多尺度梯度GAN)。摘要虽然生成对抗网络在图像合成任务中取得…

Flutter实例——路由跳转的动画效果

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

2012(第三届)预赛第四题

某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题&…

Android实战跑腿项目——gradle配置

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。 叮叮叮:产品已上线——>请关…

dwr框架查看外放方法_Flutter框架层启动源码剖析

博主相关文章列表Flutter 框架实现原理Flutter 框架层启动源码剖析Flutter 页面更新流程剖析Flutter 事件处理源码剖析Flutter 路由源码剖析Flutter 安卓平台源码剖析(一)Flutter 自定义控件之RenderObjectFlutter框架层启动源码剖析PS: 剖析源码版本为F…

蓝桥杯2012(第三届)(分段乘法)

大数乘法&#xff08;分块乘法&#xff09;#include<iostream> #include<stdio.h> using namespace std;void bigmul(int x, int y, int r[]) {int base 10000;int x2 x / base;int x1 x % base; int y2 y / base;int y1 y % base; int m1 x1 * y1; int m2 …