1.ES的倒排索引结构本质是一些文件,最终是存在磁盘的;
2.refresh操作是将buffer中不可见的数据刷到内存;
3.flush操作会先执行一次refresh操作,将buffer中不可见的数据刷到内存,再将内存中的data数据刷到磁盘,清空translog数据;
倒排索引结构怎么理解?
1.先看一下elasticsearch中一些概念的层级关系:自上而下分别为:前缀索引层、倒排索引层、数据存储层
2.通常说的倒排索引层实际上就是上图中对应的倒排索引层,正排索引就类似于一个目录,倒排索引就是一个term(词)与doc编号列表的一个键值对。
3.由于倒排索引在数据量很大的情况下,键值对占用空间也很大,于是ES设计了一层前缀索引,前缀索引是用于快速找到倒排索引中的term(key)。
4.前缀索引是常驻内存的,lucene6之前是字典树,之后是FST结构。
为什么说倒排索引结构最终是落到磁盘?
1.在refresh之后也就生成了一个segment,即产生了倒排索引和前缀索引,此时没有到触发flush的条件,前缀索引、倒排索引、doc源数据全部在内存。
2.触发flush,会先执行一次refresh(防止数据在buffer中),然后将倒排索引和doc源数据写到磁盘(FST不会写到磁盘),将translog数据清空。所以倒排索引结构会先在内存,最终写入磁盘。
update操作与get API
1.update操作会先get到数据,再覆盖数据,在ES5.x版本时,get操作会执行一次refresh,大量的update操作会导致大量的segment,在ES2.x以及5.x之后的版本,都是使用translog来实现update中的第一步(get)。
2.get API是要求实时的,5.x版本是使用refresh来实现,之前和之后版本都是使用translog实现。