谈谈lucene的数据域合并

记得一年前写了谈谈lucene的数据域存储,主要说明了数据域的存储结构和压缩,而这里主要说明多个数据段中数据域的合并。算法

一种最朴素的合并方法是将每一个数据段中的document读取出来,而后从新写成一个新的数据段。固然lucene采用了更加“灵活”的方法,而这种朴素的合并方法也只有当不一样的lucene版本进行合并时才使用。实际上lucene真正合并时有三种方式:数组

一、第一种为needsIndexSort属性为true时的写入方式(因为对该属性暂时未研究,所以放到之后进行分析);.net

二、当数据段采用了相同的压缩算法,每一个段中的chunkSize相同而且没有更新数据时,能够将整个段中的数据直接复制到当前的数据段中,这也是最快的方式;这里有个注意事项,因为每一个数据段中一般最后一个数据块是写不满的(lucene中称之为脏块),当脏块的数量超过必定限度时,是不能直接按照该方式进行合并的!指针

三、若是不知足第二个条件,此时就须要从每一个数据段中将document读取出来,而后再写入,可是lucene记录了每条数据的文件指针,因此在读取时并无解析数据类型,而是直接复制字节数组。blog

    最后从lucene的代码中也能够看出,lucene是在数据合并时将更新数据从新写入新的数据块中的。get

相关文章
相关标签/搜索