我在看Adrien Grand的talk on Lucene's index architecture,他提出的一点是Lucene使用排序数组来表示其倒排索引的字典部分。背后使用排序数组而不是散列表(“经典”倒排索引数据结构)的原因是什么?为什么Lucene使用数组而不是哈希表作为其倒排索引?
哈希表提供O(1)插入和访问,这对我来说似乎对快速处理查询和合并索引段有很大帮助。另一方面,排序数组只能提供O(logN)访问和(gasp)O(N)插入,尽管合并2个排序数组与合并2个散列表具有相同的复杂度。
我能想到的散列表的唯一缺点是内存占用面积较大(这确实是一个问题)并且缓存友好性较差(尽管像查询排序数组这样的操作需要二进制搜索,就像缓存不友好一样) 。
那又怎么样? Lucene开发者必须有一个非常好的使用数组的理由。这与可伸缩性有关吗?磁盘读取速度?还有其他的东西吗?
优秀的问题! – Eugene
@Ivan在这个答案中提供了Lucene不使用哈希表的多种原因:https://stackoverflow.com/a/48053519/1697566 –