ES是一个分布式系统,基于Lucene的全文索引框架.
ES集群由一个或多个node组成,一个node即为一个ES服务进程.一个index由多个分片(shard)组成,shard分散在各个node上面,每个shard都采用Lucene来创建倒排索引,维护各自的索引数据.
- 插入
- ES中每个doc(等同一条记录)都会有唯一id,默认会对id取hash,根据shard的个数mode到对应shard上去.
这里类似MRshuffle操作中的partition操作.
因此,shard中的数据id不是有序的.
- ES先将数据写入内存中,然后一段时间后会将内存数据flush到磁盘,磁盘的索引文件会定时进行merge,保证索引文件不会过多而影响检索性能
- refresh(1s)
因为inverted index的结构复杂,需要一个专门的indexReader来查询数据,但是indexReader是以snapshot的方式打开的索引,所以需要不断refresh,默认间隔1s.所以说ES是近实时检索.
- 读取
- node接收读的request,然后node会把request分发到含有该index的shard节点
- 对应节点进行查询,并计算符合条件的doc,排序后结果汇聚到分发request的node
- node将数据返回给client
- 更新&删除
视作插入,通过timestamp和delete marker区分