微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lucene 索引建模 - 为什么使用跳过列表而不是 btree?

如何解决Lucene 索引建模 - 为什么使用跳过列表而不是 btree?

我最近开始学习 lucene,开始了解 lucene 如何存储和查询索引。 Lucene 似乎使用跳过列表作为底层数据结构。但是,我没有找到任何理由在二叉树上使用跳过列表。

跳过列表的优势在于它在并发使用时提供了良好的性能。并且 lucene 允许每个索引的单个写入线程和读取者从不可变段读取,因此跳过列表在这里也无济于事。除了二叉树(自平衡)胜过跳过列表 - 因为它提供了最坏情况下的复杂度 O(logn) 进行读写,而跳过列表提供了平均的相同时间复杂度> 案例。此外,与跳过列表相比,二叉树可以在更好的时间内提供范围查询。为了提供连词查询,lucene 使用多个帖子列表的跳过列表来查找它们的交集 - 对于这种情况,二叉树就足够了。

是否有任何特定原因在 lucene 中使用跳过列表用于我遗漏的索引目的?

解决方法

Lucene 在磁盘上使用跳过列表构建倒排索引,然后使用有限状态转换器 (FST) 将索引项的映射加载到内存中。请参阅 How does lucene index documents?

的这个 SO 答案

在那个答案中,它还表明使用 Skip-Lists 的主要好处是它避免了永远重新平衡 B 树。如果您想深入挖掘该答案,请引用另一个提供更多详细信息的答案:Skip List vs. Binary Search Tree 哪个实习生引用了其他白皮书。

再研究一下,使用跳过列表而不是 BTree 还有另一个优点。不仅避免了重新平衡,而且避免了在重新平衡发生时锁定树的一部分。这方面将进一步讨论here。后一个优势提高了并发性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。