在Flush时,首先根据设定的列排序,这个排序可以利用内存中的doc values,排序之后得到老的docID到新docID的映射,因为之前docID是按照写入顺序生成的,现在重排后,生成的是新的排列 。如果排序后与原来顺序完全一致,那么什么都不做,跟之前流程一样进行Flush 。
如果排序后顺序发生变化,如何排序呢?对于已经写到文件中的数据,比如store field和term vector,需要从文件中读出来,重新排列后再写到一个新文件里,原来的文件就相当于一个临时文件 。对于内存中的数据结构,直接在内存中重排后写到文件中 。
相比没有IndexSorting时,对性能影响比较大的一块就是store field的重排,因为这部分需要从文件中读出再写回,而其他部分都是内存操作,性能影响稍小一些 。这里我们也可以做一些思考,如果将store field和term vector这类数据也buffer在内存中,是否可以提升IndexSorting开启时的写入性能?
2. Merge时保证新的Segment数据有序
由于Flush时Segment已经是有序的了,所以在Merge时也就可以采用非常高效的Merge Sort的方式进行 。
总结IndexSorting是一种能够极大提高查询效率的技术,它通过预排序和提前中断大大减少了需要扫描的数据量,而且附带的优化是可以提高压缩率,减少存储空间 。对于查询时需要按照某列排序的场景,它非常有用,但对于相关性分数排序的场景则无法通过预排序来优化 。IndexSorting的缺点是对写入性能有影响,主要是体现在Segment的Flush和Merge阶段,对于非常看重写入性能的场景也不适合使用 。总体上说,这是一项非常有用也很新的技术,相信它在Lucene和ES中的重要性会越来越强,也会有越来越多的业务场景受益于这个功能 。
推荐阅读
- oracle数据库菜鸟教程 sqlserver日志查看
- NVIDIA显卡驱动安装教程 nvidia驱动更新在哪里
- 《拳击俱乐部》全系统解析图文教程攻略 游戏介绍
- 金蝶软件移到别的电脑上的方法 金蝶k3安装教程图解
- 3d打印建模简易教程 3d打印测试模型制作
- java零基础自学 javascript教程推荐
- flstudio20更新方法 fl20汉化教程
- centos7安装图形化界面命令 centos7安装教程详细
- 阿里云ssl免费证书申请条件 阿里云ssl证书安装教程
- ps作图基本步骤 photoshop画图教程
