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。后一个优势提高了并发性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...