Lucene索引删除策略源码分析


本文小编为大家详细介绍“Lucene索引删除策略源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Lucene索引删除策略源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Lucene中,需要持久化的索引信息都要进行commit操作,然后会生成一个segments_N的索引文件记录此次commit相关的索引信息。一次commit生成segments_N之后,就对应了一个IndexCommit,IndexCommit只是一个接口,它定义了可以从IndexCommit中获取哪些信息:IndexCommit有三个实现类:CommitPointReaderCommitSnapshotCommitPoint这个三个实现类都有对应的使用场景,在用到的时候我会再详细介绍,本文中会涉及到SnapshotCommitPoint,后面会详细介绍它。在索引的生命周期中,可以有多次的commit操作,因此也会生成多个segments_N文件,对于这些文件是否要保留还是删除,lucene中是通过IndexDeletionPolicy来管理的。我们先来看下IndexDeletionPolicy的接口定义:从上面我可以看到,索引的删除策略其实只在两个地方进行应用,一个是加载索引的时候,打开一个旧索引时,根据当前设置的IndexDeletionPolicy进行处理。另一个是有新的commit产生时,借这个机会处理所有的commit。Lucene中提供的索引删除策略一共有四种,不过可以分为三类:NoDeletionPolicy索引删除策略就是保留所有的commit信息,效果就是你有多少次commit就多少个segments_N文件,看个例子:上面的例子中有两次commit,下图是NoDeletionPolicy策略进行了两次commit的索引目免费云主机域名录结构,可以看到生成了两个segments_N文件:NoDeletionPolicy的代码实现非常简单,单例实现,并且在onCommit和onInit的时候都是空操作:KeepOnlyLastCommitDeletionPolicy是Lucene默认的索引删除策略,只保留最新的一次commit,从索引目录看不管执行多少次commit只保留了N最大的segments_N文件,下图是KeepOnlyLastCommitDeletionPolicy策略进行了两次commit的结果,KeepOnlyLastCommitDeletionPolicy删除策略只保留了segments_2。把上面示例代码中的删除策略替换成KeepOnlyLastCommitDeletionPolicy,即可得到,注意需要先清空索引目录:KeepOnlyLastCommitDeletionPolicy代码实现也比较简单,除了最后一个commit之外,其他的commit都删除:快照相关的删除策略有两个,SnapshotDeletionPolicy和PersistentSnapshotDeletionPolicy,分别对应了不可持久化和可持久化的模式。不管是SnapshotDeletionPolicy还是PersistentSnapshotDeletionPolicy,他们都封装了其他的IndexDeletionPolicy来执行删除策略,他们只是提供了为当前最新的commit生成快照的能力。只要快照存在,则跟快照相关的所有索引文件都会被无条件保留。在上面的例子中,我们使用SnapshotDeletionPolicy,SnapshotDeletionPolicy底层封装的是KeepOnlyLastCommitDeletionPolicy,我们进行了三次commit,理论上KeepOnlyLastCommitDeletionPolicy只会保留最后一次,但是因为我们对第一次的commit进行了快照,所以第一次commit也被保留了:接下来我们看看SnapshotDeletionPolicy是怎么实现。SnapshotDeletionPolicy保证生成快照的commit不会被删除的原理就是引用计数,SnapshotDeletionPolicy会记录每个commit生成快照的次数,在删除的时候,只会删除引用计数为0的commit。生成快照只会对当前最新的一个commit进行快照:前面我们列出了SnapshotCommitPoint是IndexCommit的一个实现类,但是没有详细介绍,SnapshotCommitPoint除了能够提供IndexCommit接口所提供的信息之外,最核心的是在删除的时候,会先判断IndexCommit是否被快照引用,只有没有任何快照引用的IndexCommit才能删除:需要注意的是SnapshotDeletionPolicy的快照信息是没有持久化,我们重新打开SnapshotDeletionPolicyTest例子中生成的索引:可以发现segments_1被删除了,因为没有持久化快照信息,所以根据KeepOnlyLastCommitDeletionPolicy的删除策略,只保留了最新的一个commit:PersistentSnapshotDeletionPolicy主要是为了解决SnapshotDeletionPolicy无法持久化的问题。PersistentSnapshotDeletionPolicy持久化的时候会生成snapshots_N的索引文件,我们看个例子:上面的例子和我们在介绍SnapshotDeletionPolicy的时候逻辑一样,只是把SnapshotDeletionPolicy换成了PersistentSnapshotDeletionPolicy,我们看结果:从上面结果图中可以看到,segments_1和segments_3同样被保留了,但是多了一个持久化的快照信息的文件snapshots_0,有了这个文件,索引重新打开的时候就可以恢复快照信息,segments_1还是会被保留,用下面的例子我们重新打开索引,可以发现segments_1还是被保留了:接下来我们看看PersistentSnapshotDeletionPolicy的实现,主要就是持久化和恢复快照信息的逻辑。读到这里,这篇“Lucene索引删除策略源码分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: C++高并发内存池如何实现

这篇文章主要讲解了“C++高并发内存池如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++高并发内存池如何实现”吧!池化技术在说内存池之前,我们得先了解一下“池化技术”。所谓“池化技术”,就是程序先向系…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/21 21:27
Next 05/21 21:27

相关推荐