为了提高效率,ElasticSearch可以将索引下某一个Document Value全部读取到内存中进行操作,这大大提升访问速度,但是也同时会消耗掉大量的内存空间。
总之,这些数据结构Inverted Index、Stored Fields、Document Values及其缓存,都在segment内部。
搜索发生时
搜索时,Lucene会搜索所有的segment然后将每个segment的搜索结果返回,最后合并呈现给客户。
Lucene的一些特性使得这个过程非常重要:
- Segments是不可变的(immutable)
- Delete? 当删除发生时,Lucene做的只是将其标志位置为删除,但是文件还是会在它原来的地方,不会发生改变
- Update? 所以对于更新来说,本质上它做的工作是:先删除,然后重新索引(Re-index)
- 随处可见的压缩
- Lucene非常擅长压缩数据,基本上所有教科书上的压缩方式,都能在Lucene中找到。
- 缓存所有的所有
- Lucene也会将所有的信息做缓存,这大大提高了它的查询效率。
缓存的故事
当ElasticSearch索引一个文件的时候,会为文件建立相应的缓存,并且会定期(每秒)刷新这些数据,然后这些文件就可以被搜索到。
随着时间的增加,我们会有很多segments,
所以ElasticSearch会将这些segment合并,在这个过程中,segment会最终被删除掉
这就是为什么增加文件可能会使索引所占空间变小,它会引起merge,从而可能会有更多的压缩。
举个栗子
有两个segment将会merge