查看: 540|回复: 9

ES索引存储原理

[复制链接]
新浪微博达人勋 xenron  实名认证
论坛徽章:
264
python徽章
日期:2019-11-14 15:08:05
发表于 2019-9-15 19:35 | 显示全部楼层 |阅读模式

存储 原理

回复

使用道具 举报

论坛徽章:
12
Oracle研习者初级
日期:2012-07-19 01:06:10矩阵计算徽章
日期:2014-11-06 14:52:15kettle徽章
日期:2014-11-06 14:46:10Oracle研习者中级
日期:2014-09-19 14:31:38Oracle研习者中级
日期:2014-09-19 14:29:20Oracle研习者高级
日期:2014-09-19 14:27:40Oracle研习者初级
日期:2014-09-19 14:06:28Oracle研习者高级
日期:2013-08-25 14:24:26Oracle研习者高级
日期:2013-08-25 14:23:36Hadoop研习者初级
日期:2012-09-28 23:48:40SAS研习者初级
日期:2012-08-20 22:27:43比特币徽章
日期:2014-11-06 14:54:26
发表于 2019-9-15 21:53 | 显示全部楼层
在学习ES时了解索引的存储原理很重要,能极大地帮忙学习ES技术。
回复 支持 反对

使用道具 举报

论坛徽章:
15
Oracle研习者初级
日期:2013-08-08 23:03:13Java徽章
日期:2019-06-27 16:21:50python徽章
日期:2019-06-27 16:21:37股票徽章
日期:2019-01-24 16:03:16股票徽章
日期:2018-11-22 15:36:24Kafka徽章
日期:2018-10-18 15:09:17股票徽章
日期:2018-08-30 15:33:51spark徽章
日期:2018-06-14 15:36:26spark徽章
日期:2017-11-23 16:58:48Hadoop研习者初级
日期:2017-05-18 16:19:47Oracle研习者中级
日期:2017-04-27 17:49:47机器学习徽章
日期:2015-03-02 18:03:11
发表于 2019-9-16 00:20 | 显示全部楼层
挺不错的文档  抽时间仔细看一下                          
回复 支持 反对

使用道具 举报

新浪微博达人勋 xenron  实名认证
论坛徽章:
264
python徽章
日期:2019-11-14 15:08:05
 楼主| 发表于 2019-9-16 15:18 | 显示全部楼层
不变性
写到磁盘的倒序索引是不变的:自从写到磁盘就再也不变。 这会有很多好处:

不需要添加锁。不存在写操作,因此不存在多线程更改数据。
提高读性能。一旦索引被内核的文件系统做了Cache,绝大多数的读操作会直接从内存而不需要经过磁盘。
提升其他缓存(例如fiter cache)的性能。其他的缓存在该索引的生命周期内保持有效,减少磁盘I/O和计算消耗。
回复 支持 反对

使用道具 举报

新浪微博达人勋 xenron  实名认证
论坛徽章:
264
python徽章
日期:2019-11-14 15:08:05
 楼主| 发表于 2019-9-16 15:18 | 显示全部楼层
segment工作流程

1.新的文档在内存中组织。
2.每隔一段时间,buffer将会被提交: 生成一个新的segment(一个额外的新的倒序索引)并被写到磁盘,同时一个
  新的提交点(commit point)被写入磁盘,包含新的segment的名称。 磁盘fsync,所有在内核文件系统中的数据等待被写入到磁盘,来保障它们被物理写入。
3.新的segment被打开,使它包含的文档可以被索引。
4.内存中的buffer将被清理,准备接收新的文档。
回复 支持 反对

使用道具 举报

新浪微博达人勋 xenron  实名认证
论坛徽章:
264
python徽章
日期:2019-11-14 15:08:05
 楼主| 发表于 2019-9-16 15:19 | 显示全部楼层
Segment合并
通过每隔一秒的自动刷新机制会创建一个新的segment,用不了多久就会有很多的segment。segment会消耗系统的文件句柄,内存,CPU时钟。最重要的是,每一次请求都会依次检查所有的segment。segment越多,检索就会越慢。

ES通过在后台merge这些segment的方式解决这个问题。小的segment merge到大的,大的merge到更大的。。。

这个过程也是那些被”删除”的文档真正被清除出文件系统的过程,因为被标记为删除的文档不会被拷贝到大的segment中。
回复 支持 反对

使用道具 举报

论坛徽章:
17
Oracle研习者初级
日期:2013-04-18 13:19:15redis徽章
日期:2017-05-18 16:17:49Oracle研习者初级
日期:2017-03-30 14:31:27Oracle研习者中级
日期:2016-06-02 10:27:16高并发架构徽章
日期:2016-01-07 10:11:08Goldengate徽章
日期:2015-10-22 15:11:16架构徽章
日期:2015-04-29 17:09:41linux徽章
日期:2014-11-06 15:15:45mysql徽章
日期:2014-11-06 15:13:52mysql徽章
日期:2014-11-06 15:13:24python徽章
日期:2014-09-23 14:45:41Oracle研习者中级
日期:2014-09-19 14:29:20
发表于 2019-9-17 10:29 | 显示全部楼层
这里的segment到底是什么意思?跟Oracle的segment是类似的吗?
回复 支持 反对

使用道具 举报

论坛徽章:
36
树莓派
日期:2015-04-10 15:20:01python徽章
日期:2017-08-17 17:09:36python徽章
日期:2017-10-20 16:37:41区块链徽章
日期:2018-01-18 18:02:56金融徽章
日期:2018-03-01 16:43:15Hadoop研习者初级
日期:2018-03-29 16:08:43R研习者中级
日期:2018-04-26 15:27:36python徽章
日期:2018-06-21 17:15:38股票徽章
日期:2018-08-24 10:51:37计算徽章
日期:2018-09-21 16:51:47股票徽章
日期:2018-11-01 14:04:25股票徽章
日期:2019-01-10 14:04:57
发表于 2019-10-6 10:57 | 显示全部楼层
不需要添加锁。不存在写操作,因此不存在多线程更改数据。
提高读性能。一旦索引被内核的文件系统做了Cache,绝大多数的读操作会直接从内存而不需要经过磁盘。
提升其他缓存(例如fiter cache)的性能。其他的缓存在该索引的生命周期内保持有效,减少磁盘I/O和计算消耗。
回复 支持 反对

使用道具 举报

论坛徽章:
36
树莓派
日期:2015-04-10 15:20:01python徽章
日期:2017-08-17 17:09:36python徽章
日期:2017-10-20 16:37:41区块链徽章
日期:2018-01-18 18:02:56金融徽章
日期:2018-03-01 16:43:15Hadoop研习者初级
日期:2018-03-29 16:08:43R研习者中级
日期:2018-04-26 15:27:36python徽章
日期:2018-06-21 17:15:38股票徽章
日期:2018-08-24 10:51:37计算徽章
日期:2018-09-21 16:51:47股票徽章
日期:2018-11-01 14:04:25股票徽章
日期:2019-01-10 14:04:57
发表于 2019-10-6 10:57 | 显示全部楼层
不需要添加锁。不存在写操作,因此不存在多线程更改数据。
提高读性能。一旦索引被内核的文件系统做了Cache,绝大多数的读操作会直接从内存而不需要经过磁盘。
提升其他缓存(例如fiter cache)的性能。其他的缓存在该索引的生命周期内保持有效,减少磁盘I/O和计算消耗。
回复 支持 反对

使用道具 举报

论坛徽章:
0
发表于 2019-10-24 14:22 | 显示全部楼层
Lucene 工作流程
如何创建索引
1、找出文档 2、将原文档传给分次组件(Tokenizer) 3将得到的词元(Token)传给语言处理组件(Linguistic Processor)  4、将得到的词(Term)传给索引组件(Indexer)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-11-20 08:22 , Processed in 0.138127 second(s), 59 queries .

关闭

扫一扫加入
本版微信群