【发布时间】:2017-12-26 23:41:21
【问题描述】:
我正在观看 Adrien Grand 的 talk on Lucene's index architecture,他指出 Lucene 使用排序数组来表示其倒排索引的字典部分。使用排序数组而不是哈希表(“经典”倒排索引数据结构)背后的原因是什么?
哈希表提供 O(1) 的插入和访问,在我看来这对快速处理查询和合并索引段有很大帮助。另一方面,排序数组只能提供 O(logN) 访问和 (gasp) O(N) 插入,尽管合并 2 个排序数组与合并 2 个哈希表的复杂性相同。
我能想到的哈希表的唯一缺点是更大的内存占用(这确实可能是一个问题)和缓存友好性较低(尽管查询排序数组之类的操作需要二进制搜索,这与缓存不友好一样)。
那么怎么了? Lucene 开发人员一定有充分的理由使用数组。它与可扩展性有关吗?磁盘读取速度?完全不同的东西?
【问题讨论】:
-
好问题!
-
@Ivan 在这个答案中提供了 Lucene 不使用哈希表的多个原因:stackoverflow.com/a/48053519/1697566
标签: arrays indexing lucene hashmap hashtable