【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
记得一年前写了谈谈lucene的数据域存储,主要说明了数据域的存储结构和压缩,而这里主要说明多个数据段中数据域的合并。
一种最朴素的合并方法是将每个数据段中的document读取出来,然后重新写成一个新的数据段。当然lucene采用了更加“灵活”的方法,而这种朴素的合并方法也只有当不同的lucene版本进行合并时才使用。实际上lucene真正合并时有三种方式:
1、第一种为needsIndexSort属性为true时的写入方式(由于对该属性暂时未研究,因此放到以后进行分析);
2、当数据段采用了相同的压缩算法,每个段中的chunkSize相同并且没有更新数据时,可以将整个段中的数据直接复制到当前的数据段中,这也是最快的方式;这里有个注意事项,由于每个数据段中通常最后一个数据块是写不满的(lucene中称之为脏块),当脏块的数量超过一定限度时,是不能直接按照该方式进行合并的!
3、如果不满足第二个条件,此时就需要从每个数据段中将document读取出来,然后再写入,但是lucene记录了每条数据的文件指针,所以在读取时并没有解析数据类型,而是直接复制字节数组。
最后从lucene的代码中也可以看出,lucene是在数据合并时将更新数据重新写入新的数据块中的。
来源:oschina
链接:https://my.oschina.net/u/1268334/blog/3144124